Index: /BasicCompiler32/BasicCompiler.h
===================================================================
--- /BasicCompiler32/BasicCompiler.h (revision 3)
+++ /BasicCompiler32/BasicCompiler.h (revision 3)
@@ -0,0 +1,93 @@
+#include "../BasicCompiler_Common/common.h"
+
+LPSTR BasicFileFilter="プログラム ファイル(*.ab;*.bas;*.abp;*.sbp)\0*.ab;*.bas;*.abp;*sbp\0テキスト ファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*\0\0";
+LPSTR ExeFileFilter="実行可能ファイル(*.exe)\0*.exe\0すべてのファイル(*.*)\0*\0\0";
+
+HINSTANCE hInst;
+HWND hOwnerEditor;
+HWND hMainDlg;
+HWND hDebugWnd;
+HANDLE hHeap;
+int ScreenX,ScreenY;
+WNDPROC OldErrorListProc,OldDebugListProc;
+WNDPROC OldThreadComboProc;
+WNDPROC OldProcComboProc;
+unsigned short TypeOfSubSystem;
+BOOL bClipCompileView;
+
+//不揮発性データ(レジストリに保存される)
+CNonVolatile *pobj_nv;
+
+//プログラム情報
+BOOL bCompilingGlobal;
+BOOL bStrict;
+DWORD ImageBase;
+INCLUDEFILEINFO IncludeFileInfo;
+SUBINFO **ppSubHash;
+int SubNum;
+char **ppMacroNames;
+int MacroNum;
+DECLAREINFO **ppDeclareHash;
+CONSTINFO **ppConstHash;
+PROCPTRINFO *pProcPtrInfo;
+int ProcPtrInfoNum;
+
+ERRORINFO *pErrorInfo;
+int ErrorNum;
+int CompileMsgNum;
+int WarningNum;
+BOOL bError;
+char **SynonymErrorWords;
+int SynonymErrorNum;
+BOOL bStopCompile;
+
+//リソース情報
+char ResourceFileName[MAX_PATH];
+RESOURCEDATAINFO *pCursorResourceInfo;
+int CursorResourceNum;
+RESOURCEDATAINFO *pBitmapResourceInfo;
+int BitmapResourceNum;
+RESOURCEDATAINFO *pIconResourceInfo;
+int IconResourceNum;
+char szManifestPath[MAX_PATH];
+int XPManiResourceNum;
+
+//デバッグ
+BOOL bDebugCompile=0;
+BOOL bDebugRun=0;
+BOOL bAttach=0;
+DWORD dwAttachProcessId;
+BOOL bDebugSupportProc;
+BOOL bSystemProc;
+DWORD dwStepRun;
+double width_ratio_VarList=0.3;
+HWND hDebuggerToolbar;
+char szDebugCmdLine[1024];
+char szDebugExeForDll[1024];
+
+//デバッグ用行番号情報
+LINEINFO *pLineInfo;
+int MaxLineInfoNum;
+
+//ウォッチリスト
+int width_WatchColumn_Expression=200;
+int width_WatchColumn_Value=400;
+
+
+//関数ポインタのベース タイプ インデックス(左辺の関数ポインタのパラメータを参考に、オーバーロードを解決)
+LONG_PTR ProcPtr_BaseIndex;
+
+
+int cp;
+
+BOOL bDll;
+
+char *basbuf;
+char *pBaseBuffer;
+
+char BasicSystemDir[MAX_PATH]; //BasicCompiler.exeが存在するディレクトリ
+char BasicCurDir[MAX_PATH]; //コンパイルするファイルが存在するディレクトリ
+char SourceFileName[MAX_PATH];
+char OutputFileName[MAX_PATH];
+char szDllName[MAX_PATH];
+char szIncludeDir[MAX_PATH]="";
Index: /BasicCompiler32/BasicCompiler.rc
===================================================================
--- /BasicCompiler32/BasicCompiler.rc (revision 3)
+++ /BasicCompiler32/BasicCompiler.rc (revision 3)
@@ -0,0 +1,412 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// 日本語 resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+#ifdef _WIN32
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+#pragma code_page(932)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_MAIN$(JPN) DIALOG DISCARDABLE 0, 0, 205, 229
+#else
+IDD_MAIN DIALOG DISCARDABLE 0, 0, 205, 229
+#endif
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "ActiveBasic Compiler&Debugger"
+FONT 9, "MS Pゴシック"
+BEGIN
+ DEFPUSHBUTTON "コンパイル",IDOK,148,208,50,14
+ LTEXT "出力先:",IDC_STATIC,7,10,23,8
+ EDITTEXT IDC_EXEPATH,34,7,164,14,ES_AUTOHSCROLL
+ CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",0x0,13,56,
+ 179,14
+ GROUPBOX "進行状況",IDC_STATIC,7,31,191,45
+ LTEXT "準備中...",IDC_MESSAGE,13,44,161,8
+ GROUPBOX "メッセージ リスト",IDC_STATIC,7,83,191,117
+ EDITTEXT IDC_ERRORLIST,13,113,179,80,ES_MULTILINE |
+ ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_DISABLED |
+ WS_VSCROLL | WS_HSCROLL
+ CONTROL "エラー",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,13,97,35,10
+ CONTROL "デバッグ",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,50,97,35,10
+ EDITTEXT IDC_DEBUGLIST,13,113,179,80,ES_MULTILINE |
+ ES_AUTOVSCROLL | ES_AUTOHSCROLL | NOT WS_VISIBLE |
+ WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+ LTEXT "Version",IDC_STATIC_VERSION,7,214,140,8
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_VARLIST$(JPN) DIALOG DISCARDABLE 0, 0, 215, 199
+#else
+IDD_VARLIST DIALOG DISCARDABLE 0, 0, 215, 199
+#endif
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+CAPTION "ブレーク ポイント"
+FONT 9, "MS Pゴシック"
+BEGIN
+ PUSHBUTTON "閉じる",IDCANCEL,165,6,50,14
+ LTEXT "対象領域:",IDC_STATIC,2,9,30,8
+ LTEXT "対象スレッド:",IDC_STATIC,2,26,38,8
+ COMBOBOX IDC_THREADCOMBO,43,24,69,100,CBS_DROPDOWNLIST | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ CONTROL "Tree1",IDC_VARTREE,"SysTreeView32",TVS_HASBUTTONS |
+ TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP,
+ 0,88,215,111
+ CONTROL "グローバル",IDC_GLOBAL,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,43,6,47,14
+ CONTROL "ローカル",IDC_LOCAL,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,92,6,47,14
+ LTEXT "プロシージャ:",IDC_STATIC,2,43,39,8
+ COMBOBOX IDC_PROCCOMBO,43,40,69,116,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ CONTROL "システム変数を表示しない",IDC_HIDESYSVAR,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,117,44,93,10
+ PUSHBUTTON "ステップ(IN)",IDC_STEPIN,4,64,50,14
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,59,215,1
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,81,215,1
+ PUSHBUTTON "ステップ(OVER)",IDC_STEPOVER,57,64,50,14
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_CLIPMAIN$(JPN) DIALOGEX 0, 0, 332, 88
+#else
+IDD_CLIPMAIN DIALOGEX 0, 0, 332, 88
+#endif
+STYLE WS_CHILD
+FONT 9, "MS Pゴシック"
+BEGIN
+ PUSHBUTTON "コンパイル",IDOK,0,0,37,13
+ EDITTEXT IDC_EXEPATH,285,57,24,12,ES_AUTOHSCROLL | ES_READONLY |
+ NOT WS_VISIBLE
+ EDITTEXT IDC_ERRORLIST,38,14,129,74,ES_MULTILINE | ES_AUTOVSCROLL |
+ ES_AUTOHSCROLL | WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+ CONTROL "ビルド",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,0,20,37,12
+ CONTROL "デバッグ",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,0,34,37,12
+ EDITTEXT IDC_DEBUGLIST,38,15,179,73,ES_MULTILINE | ES_AUTOVSCROLL |
+ ES_AUTOHSCROLL | NOT WS_VISIBLE | WS_DISABLED |
+ WS_VSCROLL | WS_HSCROLL
+ CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH,
+ 38,1,293,12
+ LTEXT "準備中...",IDC_MESSAGE,286,47,24,8,NOT WS_VISIBLE,
+ WS_EX_TRANSPARENT
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,16,39,1
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_CLIPMAIN$(ENG) DIALOGEX 0, 0, 332, 88
+#else
+IDD_CLIPMAIN DIALOGEX 0, 0, 332, 88
+#endif
+STYLE WS_CHILD
+FONT 9, "MS Pゴシック", 0, 0, 0x1
+BEGIN
+ PUSHBUTTON "Compile",IDOK,0,0,37,11
+ EDITTEXT IDC_EXEPATH,285,57,24,12,ES_AUTOHSCROLL | ES_READONLY |
+ NOT WS_VISIBLE
+ EDITTEXT IDC_ERRORLIST,38,13,129,75,ES_MULTILINE | ES_AUTOVSCROLL |
+ ES_AUTOHSCROLL | WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+ CONTROL "Error",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,0,17,37,10
+ CONTROL "Debug",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,0,28,37,10
+ EDITTEXT IDC_DEBUGLIST,38,14,179,74,ES_MULTILINE | ES_AUTOVSCROLL |
+ ES_AUTOHSCROLL | NOT WS_VISIBLE | WS_DISABLED |
+ WS_VSCROLL | WS_HSCROLL
+ CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH,
+ 38,0,293,12
+ LTEXT "Waiting...",IDC_MESSAGE,286,47,24,8,NOT WS_VISIBLE,
+ WS_EX_TRANSPARENT
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,13,39,1
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_MAIN$(ENG) DIALOG DISCARDABLE 0, 0, 205, 229
+#else
+IDD_MAIN DIALOG DISCARDABLE 0, 0, 205, 229
+#endif
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "ActiveBasic Compiler&Debugger"
+FONT 9, "MS Pゴシック"
+BEGIN
+ DEFPUSHBUTTON "Compile",IDOK,148,208,50,14
+ LTEXT "Output:",IDC_STATIC,7,10,22,8
+ EDITTEXT IDC_EXEPATH,34,7,164,14,ES_AUTOHSCROLL
+ CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",0x0,13,56,
+ 179,14
+ GROUPBOX "Advance situation",IDC_STATIC,7,31,191,45
+ LTEXT "ready...",IDC_MESSAGE,13,44,161,8
+ GROUPBOX "Message list",IDC_STATIC,7,83,191,117
+ EDITTEXT IDC_ERRORLIST,13,113,179,80,ES_MULTILINE |
+ ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_DISABLED |
+ WS_VSCROLL | WS_HSCROLL
+ CONTROL "Error",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,13,97,30,10
+ CONTROL "Debug",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,50,97,35,10
+ EDITTEXT IDC_DEBUGLIST,13,113,179,80,ES_MULTILINE |
+ ES_AUTOVSCROLL | ES_AUTOHSCROLL | NOT WS_VISIBLE |
+ WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+ LTEXT "Version 4.00 Global Edition beta1",IDC_STATIC,7,214,98,
+ 8
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_VARLIST$(ENG) DIALOG DISCARDABLE 0, 0, 215, 199
+#else
+IDD_VARLIST DIALOG DISCARDABLE 0, 0, 215, 199
+#endif
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+CAPTION "Breakpoint"
+FONT 9, "MS Pゴシック"
+BEGIN
+ PUSHBUTTON "Close",IDCANCEL,165,6,50,14
+ LTEXT "Level:",IDC_STATIC,2,9,18,8
+ LTEXT "Thread:",IDC_STATIC,2,26,22,8
+ COMBOBOX IDC_THREADCOMBO,43,24,69,100,CBS_DROPDOWNLIST | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ CONTROL "Tree1",IDC_VARTREE,"SysTreeView32",TVS_HASBUTTONS |
+ TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP,
+ 0,88,215,111
+ CONTROL "Global",IDC_GLOBAL,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,43,6,47,14
+ CONTROL "Local",IDC_LOCAL,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,92,6,47,14
+ LTEXT "Procedure:",IDC_STATIC,2,43,31,8
+ COMBOBOX IDC_PROCCOMBO,43,40,69,116,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ CONTROL "Hide system variables",IDC_HIDESYSVAR,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,117,44,81,10
+ PUSHBUTTON "Step In",IDC_STEPIN,4,64,50,14
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,59,215,1
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,81,215,1
+ PUSHBUTTON "Step Over",IDC_STEPOVER,57,64,50,14
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_DEBUGGER$(JPN) DIALOGEX 0, 0, 291, 148
+#else
+IDD_DEBUGGER DIALOGEX 0, 0, 291, 148
+#endif
+STYLE WS_CHILD
+FONT 9, "MS Pゴシック", 0, 0, 0x1
+BEGIN
+ LTEXT "対象スレッド:",IDC_STATIC,5,21,38,8
+ COMBOBOX IDC_THREADCOMBO,5,30,69,100,CBS_DROPDOWNLIST | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ LTEXT "プロシージャ:",IDC_STATIC,5,49,39,8
+ COMBOBOX IDC_PROCCOMBO,5,58,69,116,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,15,99,1
+ LTEXT "dummy",IDC_VARPOS,98,0,35,41,NOT WS_VISIBLE,
+ WS_EX_STATICEDGE
+ CONTROL "List2",IDC_WATCHLIST,"SysListView32",LVS_REPORT |
+ LVS_EDITLABELS | WS_BORDER | WS_TABSTOP,171,9,60,50,
+ WS_EX_ACCEPTFILES
+ LTEXT "コマンド",IDC_STATIC,3,3,23,8
+END
+#endif
+
+IDD_DEBUGGER_TOOLBARBASE DIALOG DISCARDABLE 0, 0, 62, 15
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "MS Pゴシック"
+BEGIN
+END
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_DEBUGGER$(ENG) DIALOGEX 0, 0, 291, 148
+#else
+IDD_DEBUGGER DIALOGEX 0, 0, 291, 148
+#endif
+STYLE WS_CHILD
+FONT 9, "MS Pゴシック", 0, 0, 0x1
+BEGIN
+ LTEXT "Thread:",IDC_STATIC,5,21,22,8
+ COMBOBOX IDC_THREADCOMBO,5,30,69,100,CBS_DROPDOWNLIST | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ LTEXT "Procedure:",IDC_STATIC,5,49,31,8
+ COMBOBOX IDC_PROCCOMBO,5,58,69,116,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,15,99,1
+ LTEXT "dummy",IDC_VARPOS,98,0,35,41,NOT WS_VISIBLE,
+ WS_EX_STATICEDGE
+ CONTROL "List2",IDC_WATCHLIST,"SysListView32",LVS_REPORT |
+ LVS_EDITLABELS | WS_BORDER | WS_TABSTOP,171,9,60,50,
+ WS_EX_ACCEPTFILES
+ LTEXT "コマンド",IDC_STATIC,3,3,23,8
+END
+#endif
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE
+BEGIN
+ "IDD_MAIN$(JPN)", DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 198
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 222
+ END
+
+ "IDD_VARLIST$(JPN)", DIALOG
+ BEGIN
+ BOTTOMMARGIN, 161
+ END
+
+ "IDD_MAIN$(ENG)", DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 198
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 222
+ END
+
+ "IDD_VARLIST$(ENG)", DIALOG
+ BEGIN
+ BOTTOMMARGIN, 161
+ END
+
+ IDD_DEBUGGER_TOOLBARBASE, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 55
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 8
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_MAIN ICON DISCARDABLE "icon1.ico"
+IDI_VARSTRUCT ICON DISCARDABLE "VarStruct.ico"
+IDI_VARDATA ICON DISCARDABLE "VarData.ico"
+IDI_VARSTR ICON DISCARDABLE "VarStr.ico"
+IDI_VARARRAY ICON DISCARDABLE "VarArray.ico"
+IDI_VARPTRSTRUCT ICON DISCARDABLE "VarPtrStruct.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Toolbar
+//
+
+IDR_DEBUGGERTOOLBAR TOOLBAR DISCARDABLE 16, 15
+BEGIN
+ BUTTON IDC_DEBUG_START
+ BUTTON IDC_DEBUG_STEPOVER
+ BUTTON IDC_DEBUG_STEPIN
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Bitmap
+//
+
+IDR_DEBUGGERTOOLBAR BITMAP DISCARDABLE "toolbar_debugger.bmp"
+IDR_DEBUGGERTOOLBAR_DISABLED BITMAP DISCARDABLE "toolbar_debugger_disable.bmp"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDR_DEBUGGER_VARLIST_MENU MENU DISCARDABLE
+BEGIN
+ POPUP "dummy"
+ BEGIN
+ MENUITEM "一般システム変数を表示する", IDM_SHOW_DEFAULTSYSTEM_VAR
+ MENUITEM "RADシステム変数を表示する", IDM_SHOW_RAD_VAR
+ MENUITEM "GUID変数を表示する", IDM_SHOW_GUID_VAR
+ END
+END
+
+#endif // 日本語 resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
Index: /BasicCompiler32/BasicCompiler.vcproj
===================================================================
--- /BasicCompiler32/BasicCompiler.vcproj (revision 3)
+++ /BasicCompiler32/BasicCompiler.vcproj (revision 3)
@@ -0,0 +1,1973 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /BasicCompiler32/BasicCompiler32.sln
===================================================================
--- /BasicCompiler32/BasicCompiler32.sln (revision 3)
+++ /BasicCompiler32/BasicCompiler32.sln (revision 3)
@@ -0,0 +1,23 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual C++ Express 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BasicCompiler32", "BasicCompiler.vcproj", "{11F0E9AB-EAEC-4616-A9DD-838073342CBB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ English_Rel|Win32 = English_Rel|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {11F0E9AB-EAEC-4616-A9DD-838073342CBB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {11F0E9AB-EAEC-4616-A9DD-838073342CBB}.Debug|Win32.Build.0 = Debug|Win32
+ {11F0E9AB-EAEC-4616-A9DD-838073342CBB}.English_Rel|Win32.ActiveCfg = English_Rel|Win32
+ {11F0E9AB-EAEC-4616-A9DD-838073342CBB}.English_Rel|Win32.Build.0 = English_Rel|Win32
+ {11F0E9AB-EAEC-4616-A9DD-838073342CBB}.Release|Win32.ActiveCfg = Release|Win32
+ {11F0E9AB-EAEC-4616-A9DD-838073342CBB}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
Index: /BasicCompiler32/CParameter.cpp
===================================================================
--- /BasicCompiler32/CParameter.cpp (revision 3)
+++ /BasicCompiler32/CParameter.cpp (revision 3)
@@ -0,0 +1,591 @@
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+CParameter::CParameter(char *buffer){
+ ///////////////////////////
+ // パラメータ文字列を整理
+ ///////////////////////////
+
+ extern HANDLE hHeap;
+ int i,i2,i3;
+ char temporary[VN_SIZE];
+
+ i=0;
+ ParmsNum=0;
+ while(1){
+ if(buffer[i]=='\0') break;
+
+ for(i2=0;;i2++,i++){
+ if(buffer[i]=='\"'){
+ temporary[i2]=buffer[i];
+ for(i++,i2++;;i++,i2++){
+ temporary[i2]=buffer[i];
+ if(buffer[i]=='\"') break;
+ }
+ continue;
+ }
+
+ if(buffer[i]=='('){
+ i3=GetStringInPare(temporary+i2,buffer+i);
+ i2+=i3-1;
+ i+=i3-1;
+ continue;
+ }
+ if(buffer[i]=='['){
+ i3=GetStringInBracket(temporary+i2,buffer+i);
+ i2+=i3-1;
+ i+=i3-1;
+ continue;
+ }
+
+ if(buffer[i]==','||buffer[i]=='\0'){
+ temporary[i2]=0;
+ break;
+ }
+ temporary[i2]=buffer[i];
+ }
+
+ Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+ lstrcpy(Parms[ParmsNum],temporary);
+ ParmsNum++;
+
+ if(buffer[i]==',') i++;
+ }
+
+ ReturnTypeInfo.type=0;
+ ReturnTypeInfo.u.lpIndex=0;
+}
+CParameter::CParameter(PARAMETER_INFO *pParamInfo,int ParmNum){
+ int i;
+ for(i=0;iParmsNum=ParmNum;
+
+ ReturnTypeInfo.type=0;
+ ReturnTypeInfo.u.lpIndex=0;
+}
+CParameter::~CParameter(){
+ int i2;
+
+ //パラメータ文字列を解放
+ for(i2=0;i2type){
+ if(NATURAL_TYPE(ReturnTypeInfo.type)==DEF_OBJECT){
+ if(ReturnTypeInfo.u.lpIndex != pReturnTypeInfo->u.lpIndex) return 0;
+ }
+ }
+ else return 0;
+ }
+
+ return 1;
+}
+SUBINFO *CParameter::OverloadSolutionWithReturnType(char *name,SUBINFO **ppsi,int num){
+ int i,sw=0;
+ SUBINFO *psi;
+ psi=0;
+ for(i=0;iReturnType;
+ ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
+
+ //エラーチェック
+ if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL1)){
+ if(sw){
+ SetError(52,name,cp);
+ return 0;
+ }
+ sw=1;
+ break;
+ }
+ }
+
+ if(!sw){
+ for(i=0;iReturnType;
+ ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
+
+ //エラーチェック
+ if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL2)){
+ if(sw){
+ SetError(52,name,cp);
+ return 0;
+ }
+ sw=1;
+ break;
+ }
+ }
+ }
+
+ if(!sw){
+ for(i=0;iReturnType;
+ ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
+
+ //エラーチェック
+ if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL3)){
+ if(sw){
+ SetError(52,name,cp);
+ return 0;
+ }
+ sw=1;
+ break;
+ }
+ }
+ }
+
+ if(!sw){
+ SetError(52,name,cp);
+ return 0;
+ }
+
+ return psi;
+}
+
+SUBINFO *CParameter::OverloadSolution(char *name,SUBINFO **ppsi,int num){
+ int i,sw=0;
+ SUBINFO *psi;
+ psi=0;
+ for(i=0;ipParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL1)){
+ if(sw){
+ return OverloadSolutionWithReturnType(name,ppsi,num);
+ }
+ sw=1;
+ break;
+ }
+ }
+
+ if(!sw){
+ for(i=0;ipParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL2)){
+ if(sw){
+ return OverloadSolutionWithReturnType(name,ppsi,num);
+ }
+ sw=1;
+ break;
+ }
+ }
+ }
+
+ if(!sw){
+ for(i=0;ipParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL3)){
+ if(sw){
+ return OverloadSolutionWithReturnType(name,ppsi,num);
+ }
+ sw=1;
+ break;
+ }
+ }
+ }
+
+ if(!sw){
+ SUBINFO *temp_psi;
+ for(i=0;iParmNum==this->ParmsNum){
+ if(sw){
+ sw=0;
+ break;
+ }
+ sw=1;
+
+ psi=temp_psi;
+ }
+ }
+ }
+
+ if(!sw){
+ SetError(52,name,cp);
+ return 0;
+ }
+
+ return psi;
+}
+
+BOOL CParameter::ErrorCheck(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
+ if(ParmsNum>pi_num){
+ if(ppi[pi_num-1].type!=DEF_ELLIPSE){
+ //パラメータが多すぎるとき
+ SetError(10,FuncName,cp);
+ return 0;
+ }
+ }
+ else if(ParmsNumCopyConstructorMemberSubIndex!=-1&&
+ CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){
+ ////////////////////////////////////
+ // コピーコンストラクタを呼び出す
+ ////////////////////////////////////
+
+ //push eax
+ op_push(REG_EAX);
+
+ BOOL bUseHeap;
+ CalcType.type=NumOpe(Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
+
+ //pop ecx
+ op_pop(REG_ECX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ if(bUseHeap){
+ //※解放用に退避
+ //mov esi,ecx
+ op_mov_RR(REG_ESI,REG_ECX);
+ }
+
+ //push ecx
+ op_push(REG_ECX);
+
+ //push eax
+ op_push(REG_EAX);
+
+ //call constructor
+ op_call(pobj_Class->ppobj_Method[pobj_Class->CopyConstructorMemberSubIndex]->psi);
+
+
+ if(bUseHeap){
+ FreeTempObject(REG_ESI,pobj_Class);
+ }
+ }
+ else{
+ //push eax
+ op_push(REG_EAX);
+
+
+ if(pobj_Class->ConstructorMemberSubIndex!=-1){
+ ////////////////////////////////
+ // コンストラクタを呼び出す
+ ////////////////////////////////
+
+ //push this
+ op_push(REG_EAX);
+
+ //call constructor
+ op_call(pobj_Class->ppobj_Method[pobj_Class->ConstructorMemberSubIndex]->psi);
+ }
+
+
+ TYPEINFO CalcType;
+ BOOL bUseHeap;
+ CalcType.type=NumOpe(Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
+
+
+
+ SetObjectVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap);
+ }
+}
+
+int CParameter::SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
+ ///////////////////////////////////////////////////////////
+ // パラメータをレジスタ及びスタックフレームにセット
+ ///////////////////////////////////////////////////////////
+ int i2,i3;
+
+ BOOL bEllipse;
+ if(pi_num){
+ if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
+ else bEllipse=0;
+ }
+ else bEllipse=0;
+
+ BOOL bHas_System_LocalThis=0;
+ if(ParmsNum>=1){
+ if(lstrcmp(ppi[0].name,"_System_LocalThis")==0)
+ bHas_System_LocalThis=1;
+ }
+
+ //パラメータをレジスタとスタックに格納
+ int CalcType;
+ LONG_PTR lpCalcIndex;
+ BOOL bCalcUseHeap;
+ int ParmSize=0;
+ RELATIVE_VAR RelativeVar;
+ for(i2=ParmsNum-1;i2>=0;i2--){
+ if(bEllipse&&i2<=pi_num-2) bEllipse=0;
+
+ if(i2==0&&ppi[i2].name){
+ if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){
+ //オブジェクトメンバの第一パラメータのThisポインタ
+ continue;
+ }
+ }
+ if((i2==0||i2==1)&&ppi[i2].name){
+ if(lstrcmp(ppi[i2].name,FuncName)==0){
+ //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
+ continue;
+ }
+ }
+
+ TYPEINFO DummyTypeInfo;
+ BOOL bByVal;
+ if(bEllipse){
+ DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
+ bByVal=1;
+ }
+ else{
+ DummyTypeInfo.type=ppi[i2].type;
+ DummyTypeInfo.u.lpIndex=ppi[i2].u.index;
+ bByVal=ppi[i2].bByVal;
+ }
+
+ if(bByVal==1){
+ //値参照
+
+ if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
+ char temp2[255];
+ sprintf(temp2,"%s関数の第%dパラメータ",FuncName,i2+1);
+ SetError(19,temp2,cp);
+ continue;
+ }
+
+ if(DummyTypeInfo.type==DEF_OBJECT){
+ SetObjectParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);
+ goto next;
+ }
+
+
+ extern LONG_PTR ProcPtr_BaseIndex;
+ LONG_PTR back_ProcPtr_BaseIndex;
+ back_ProcPtr_BaseIndex=ProcPtr_BaseIndex;
+ if(DummyTypeInfo.type==DEF_PTR_PROC) ProcPtr_BaseIndex=DummyTypeInfo.u.lpIndex;
+ else ProcPtr_BaseIndex=-1;
+
+ CalcType=NumOpe(Parms[i2],DummyTypeInfo.type,DummyTypeInfo.u.lpIndex,&lpCalcIndex,&bCalcUseHeap);
+
+ ProcPtr_BaseIndex=back_ProcPtr_BaseIndex;
+
+ if(CalcType==-1) break;
+
+ if(CalcType==DEF_OBJECT){
+ //キャスト演算子のオーバーロードに対応する
+ CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
+ }
+
+ if(!bEllipse){
+ //型チェック
+ if(bHas_System_LocalThis) i3=i2-1;
+ else i3=i2;
+ CheckDifferentType(
+ DummyTypeInfo.type,
+ DummyTypeInfo.u.lpIndex,
+ CalcType,
+ lpCalcIndex,
+ FuncName,
+ i3);
+ }
+
+ if(DummyTypeInfo.type==DEF_DOUBLE){
+ ChangeTypeToDouble(CalcType);
+ ParmSize+=sizeof(long)*2;
+ }
+ else if(DummyTypeInfo.type==DEF_SINGLE){
+ ChangeTypeToSingle(CalcType);
+ ParmSize+=sizeof(long);
+ }
+ else if(DummyTypeInfo.type==DEF_INT64||DummyTypeInfo.type==DEF_QWORD){
+ ChangeTypeToInt64(CalcType);
+ ParmSize+=sizeof(long)*2;
+ }
+ else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||
+ (IsPtrType(DummyTypeInfo.type)/*&&DummyTypeInfo.type!=DEF_PTR_VOID&&DummyTypeInfo.type!=DEF_PTR_BYTE*/)){
+ ChangeTypeToLong(CalcType);
+ ParmSize+=sizeof(long);
+ }
+ else if(DummyTypeInfo.type==DEF_INTEGER||DummyTypeInfo.type==DEF_WORD){
+ ChangeTypeToInteger(CalcType);
+ ParmSize+=sizeof(long);
+ }
+ else if(DummyTypeInfo.type==DEF_CHAR||DummyTypeInfo.type==DEF_BYTE){
+ ChangeTypeToByte(CalcType);
+ ParmSize+=sizeof(long);
+ }
+ else{
+ SetError(300,NULL,cp);
+ }
+ }
+ else{
+ //ポインタ参照
+ if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
+ //ポインタ指定
+ i3=NumOpe(Parms[i2]+2,0,0,0);
+
+ ChangeTypeToLong(i3);
+ }
+ else{
+ //変数のアドレスを取得
+ int VarType;
+ LONG_PTR lpVarIndex;
+ if(!GetVarOffset(1,Parms[i2],&VarType,&RelativeVar,&lpVarIndex)) continue;
+
+ if(DummyTypeInfo.type!=DEF_ANY){
+ //型チェックを行う
+ if(DummyTypeInfo.type==VarType){
+ if(DummyTypeInfo.type==DEF_OBJECT){
+ if(DummyTypeInfo.u.lpIndex!=lpVarIndex){
+ SetError(11,Parms[i2],cp);
+ }
+ }
+ }
+ else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
+ //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
+ }
+ else{
+ SetError(11,Parms[i2],cp);
+ }
+ }
+
+ //変数アドレスをレジスタにセット
+ SetVarPtrToEax(&RelativeVar);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+
+ ParmSize+=PTR_SIZE;
+ }
+
+next:;
+ }
+
+ return ParmSize;
+}
Index: /BasicCompiler32/Compile_Calc.cpp
===================================================================
--- /BasicCompiler32/Compile_Calc.cpp (revision 3)
+++ /BasicCompiler32/Compile_Calc.cpp (revision 3)
@@ -0,0 +1,600 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void ChangeTypeToDouble_ToFpuReg(int OldType){
+ //現在のスタックの内容を実数レジスタに保存する
+ //NumOpeの直後専用
+ if(OldType==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else if(OldType==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(OldType==DEF_LONG){
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(OldType==DEF_DWORD){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //push 0
+ op_push_value(0);
+
+ //push eax
+ op_push(REG_EAX);
+
+ //fild qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x2C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //add esp,8
+ op_add_esp(8);
+ }
+}
+void ChangeTypeToDouble(int OldType){
+ //現在のスタックの内容をdouble型に変換する
+ //NumOpeの直後専用
+ if(OldType==DEF_DOUBLE) return;
+ else if(OldType==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //fstp qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDD;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(OldType==DEF_INT64||OldType==DEF_QWORD){
+ //64ビット整数型
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //fstp qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDD;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(IsWholeNumberType(OldType)){
+ //その他整数型
+
+ if(IsSignedType(OldType)){
+ //符号あり
+
+ if(OldType==DEF_INTEGER){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //movsx eax,ax
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else if(OldType==DEF_CHAR){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //movsx eax,al
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //push eax
+ op_push(REG_EAX);
+ }
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+
+ //sub esp,4
+ op_sub_esp(4);
+ }
+ else{
+ //符号なし
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //push 0
+ op_push_value(0);
+
+ //push eax
+ op_push(REG_EAX);
+
+ //fild qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x2C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+
+ //fstp qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDD;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else SetError(9,NULL,cp);
+}
+void ChangeTypeToSingle(int OldType){
+ //現在のスタックの内容をfloat型に変換する
+ //NumOpeの直後専用
+ if(OldType==DEF_SINGLE) return;
+ else if(OldType==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //fstp dword ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(OldType==DEF_INT64||OldType==DEF_QWORD){
+ //64ビット整数型
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //fstp dword ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(IsWholeNumberType(OldType)){
+ //その他整数型
+
+ if(IsSignedType(OldType)){
+ //符号あり
+
+ if(OldType==DEF_INTEGER){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //movsx eax,ax
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else if(OldType==DEF_CHAR){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //movsx eax,al
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //push eax
+ op_push(REG_EAX);
+ }
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+ }
+ else{
+ //符号なし
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+ }
+
+ //fstp dword ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else SetError(9,NULL,cp);
+}
+
+void ChangeTypeToInt64(int OldType){
+ //現在のスタックの内容をInt64型に変換する
+ //NumOpeの直後専用
+ if(Is64Type(OldType)) return;
+
+ else if(OldType==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //fistp qword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+ }
+ else if(OldType==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //fistp qword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+ }
+ else if(IsWholeNumberType(OldType)){
+ //その他整数
+
+ if(IsSignedType(OldType)){
+ //符号あり
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //cdq
+ op_cdq();
+
+ //push edx
+ op_push(REG_EDX);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else{
+ //符号なし
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //push 0
+ op_push_value(0);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ }
+ else SetError(9,NULL,cp);
+}
+void ChangeTypeToLong(int OldType){
+ //現在のスタックの内容をLong型に変換する
+ //NumOpeの直後専用
+ if(OldType==DEF_DOUBLE){
+
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //fistp dword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+ }
+ else if(OldType==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //fistp dword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+ }
+ else if(OldType==DEF_INT64||OldType==DEF_QWORD){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+}
+void ChangeTypeToInteger(int OldType){
+ //現在のスタックの内容をInteger型に変換する
+ if(OldType==DEF_BYTE||
+ OldType==DEF_WORD||OldType==DEF_INTEGER) return;
+ else if(OldType==DEF_CHAR){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //movsx eax,al
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else{
+ ChangeTypeToLong(OldType);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //and eax,0000FFFFh
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=0x0000FFFF;
+ obp+=sizeof(long);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+}
+void ChangeTypeToByte(int OldType){
+ //現在のスタックの内容をbyte型に変換する
+ if(OldType==DEF_BYTE||OldType==DEF_CHAR) return;
+
+ ChangeTypeToLong(OldType);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //and eax,000000FFh
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=0x000000FF;
+ obp+=sizeof(long);
+
+ //push eax
+ op_push(REG_EAX);
+}
+
+void OpcodeCalc(char *Command){
+ int i,i2,i3;
+ char variable[VN_SIZE];
+
+ for(i=0;;i++){
+ if(Command[i]=='\"'){
+ //ダブルクォートは不正なのでエラー扱い
+ variable[i]=0;
+ SetError(3,variable,cp);
+ return;
+ }
+
+ if(Command[i]=='('){
+ i2=GetStringInPare(variable+i,Command+i);
+ i+=i2-1;
+ continue;
+ }
+ if(Command[i]=='['){
+ i2=GetStringInBracket(variable+i,Command+i);
+ i+=i2-1;
+ continue;
+ }
+ if(Command[i]=='\0'){
+
+ ///////////////////////////////////
+ // インクリメント・デクリメント
+ ///////////////////////////////////
+
+ if(i>2){
+ if(Command[i-2]=='+'&&Command[i-1]=='+'){
+ //インクリメント
+ variable[i-2]=0;
+ IncDec(CALC_ADDITION,variable,"1");
+ return;
+ }
+ else if(Command[i-2]=='-'&&Command[i-1]=='-'){
+ //デクリメント
+ variable[i-2]=0;
+ IncDec(CALC_SUBTRACTION,variable,"1");
+ return;
+ }
+ }
+
+
+ //先端部分の識別子をエラーキーワードにする
+ for(i=0;;i++){
+ if(!IsVariableChar(Command[i])){
+ variable[i]=0;
+ break;
+ }
+ variable[i]=Command[i];
+ }
+
+ LONG_PTR lp;
+ if(GetVarType(variable,&lp,0)!=-1){
+ //変数リストに該当したとき
+ SetError(1,NULL,cp);
+ }
+ else{
+ if(GetConstHash(variable)){
+ //定数リストに該当したとき
+ SetError(1,NULL,cp);
+ }
+ else{
+ //変数リスト、定数リストに該当しないとき
+ SetError(3,variable,cp);
+ }
+ }
+ return;
+ }
+
+ i2=GetCalcId(Command+i,&i3);
+ if(i2){
+ variable[i]=0;
+
+ if(Command[i]=='=') break;
+
+ if(Command[i+1+i3]=='='){
+ IncDec(i2,variable,Command+i+1+i3+1);
+ return;
+ }
+ }
+
+ variable[i]=Command[i];
+ }
+
+ if(Command[i+1]=='\0'){
+ SetError(1,NULL,cp);
+ return;
+ }
+
+
+
+ ///////////////////////////////////////////////////////////////
+ // インデクサのsetアクセサ([]=演算子のオーバーロードに対応)
+ ///////////////////////////////////////////////////////////////
+
+ char ObjName[VN_SIZE],array_element[VN_SIZE];
+ CClass *pobj_c;
+ GetArrayElement(variable,ObjName,array_element);
+ if(array_element[0]){
+ i2=GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
+ if(i2==DEF_OBJECT){
+ char temporary[VN_SIZE];
+ sprintf(temporary,"%s.%c%c%c",ObjName,1,ESC_OPERATOR,CALC_ARRAY_SET);
+
+ char temp2[VN_SIZE];
+ sprintf(temp2,"%s,%s",array_element,Command+i+1);
+
+ int idProc;
+ void *pInfo;
+ idProc=GetProc(temporary,&pInfo);
+ if(idProc){
+ CallProc(idProc,pInfo,temporary,temp2,NULL);
+ return;
+ }
+ }
+ }
+
+
+
+ ////////////////////////////////////////
+ // 変数のタイプ型を識別して、演算を行う
+ ////////////////////////////////////////
+
+ int VarType,CalcType;
+ LONG_PTR lpVarIndex,lpCalcIndex;
+ RELATIVE_VAR VarRelativeVar;
+ BOOL bCalcUseHeap;
+
+ //型を識別
+ VarType=GetVarType(variable,&lpVarIndex,0);
+ if(VarType==-1){
+
+ // プロパティ用のメソッドを呼び出す
+ if(!CallPropertyMethod(variable,Command+i+1,NULL)){
+ //エラーを表示
+ GetVarType(variable,&lpVarIndex,1);
+ }
+
+ return;
+ }
+
+ extern LONG_PTR ProcPtr_BaseIndex;
+ if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
+ else ProcPtr_BaseIndex=-1;
+
+ if(VarType==DEF_OBJECT){
+ //代入演算のオーバーロード オペレータに備える
+
+ //変数アドレスを取得
+ if(!GetVarOffset(
+ 1,
+ variable,
+ &VarType,
+ &VarRelativeVar,
+ &lpVarIndex)) return;
+
+ SetVarPtrToEax(&VarRelativeVar);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+
+
+ //NumOpe...(スタックに答えが格納される)
+ CalcType=NumOpe(Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
+ if(VarType==-1||CalcType==-1) return;
+
+ //変数アドレスを取得
+ if(!GetVarOffset(
+ 1,
+ variable,
+ &VarType,
+ &VarRelativeVar,
+ &lpVarIndex)) return;
+
+ if(VarType&FLAG_PTR){
+ SetError(14,variable,cp);
+ return;
+ }
+
+ if(VarType==DEF_OBJECT){
+ //オブジェクトインスタンスへの代入
+ SetObjectVariable(lpVarIndex,CalcType,lpCalcIndex,bCalcUseHeap);
+ return;
+ }
+
+ if(CalcType==DEF_OBJECT){
+ //キャスト演算子のオーバーロードに対応する
+ CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);
+ }
+
+
+
+ /////////////////////////////////
+ // 右辺、左辺の型チェックを行う
+ /////////////////////////////////
+
+ CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
+
+
+ /////////////////////////////////////////////////
+ // スタックの内容を変数にコピーするコードを抽出
+ /////////////////////////////////////////////////
+
+ if(VarType==DEF_CHAR||VarType==DEF_BYTE){
+ //8ビット整数型変数へスタックの内容を格納する
+ Set8Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
+ }
+ else if(VarType==DEF_INTEGER||VarType==DEF_WORD){
+ //16ビット整数型変数へスタックの内容を格納する
+ Set16Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
+ }
+ else if(VarType==DEF_LONG||VarType==DEF_DWORD||IsPtrType(VarType)){
+ //32ビット整数型変数へスタックの内容を格納する
+ if(VarType==DEF_LONG)
+ SetLongVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
+ else
+ SetDWordVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
+ }
+ else if(VarType==DEF_INT64||VarType==DEF_QWORD){
+ //64ビット整数型変数へスタックの内容を格納する
+ SetInt64Variable(CalcType,&VarRelativeVar);
+ }
+ else if(VarType==DEF_DOUBLE){
+ //Double型変数へスタックの内容を格納する
+ SetDoubleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
+ }
+ else if(VarType==DEF_SINGLE){
+ //Single型変数へスタックの内容を格納する
+ SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
+ }
+}
Index: /BasicCompiler32/Compile_Calc_PushVar.cpp
===================================================================
--- /BasicCompiler32/Compile_Calc_PushVar.cpp (revision 3)
+++ /BasicCompiler32/Compile_Calc_PushVar.cpp (revision 3)
@@ -0,0 +1,626 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void SetReg_RealVariable(int type,RELATIVE_VAR *pRelativeVar){
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //fld ptr[ecx+offset]
+ op_fld_base_offset(type,REG_ECX,(int)pRelativeVar->offset);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ecx,offset
+ op_mov_RV(REG_ECX,(int)pRelativeVar->offset);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+
+ //fld ptr[ecx]
+ op_fld_basereg(type,REG_ECX);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //fld ptr[ebp+ecx+offset]
+ op_fld_base_offset_ex(type,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //fld ptr[ebp+offset]
+ op_fld_base_offset(type,REG_EBP,(int)pRelativeVar->offset);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add ecx,qword ptr[ebp+offset]
+ op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ecx,qword ptr[ebp+offset]
+ op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ goto directmem;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+ //fld ptr[ecx]
+ op_fld_basereg(type,REG_ECX);
+ }
+}
+void SetReg_WholeVariable(int type,RELATIVE_VAR *pRelativeVar,int reg){
+ int var_size;
+
+ var_size=GetTypeSize(type,-1);
+
+ if(var_size==sizeof(_int64)){
+ //64ビットの場合はedx:eaxにロード
+ if(reg!=REG_EAX){
+ SetError(300,NULL,cp);
+ return;
+ }
+
+ //下位32ビットをeaxにロード
+ SetReg_WholeVariable(DEF_LONG,pRelativeVar,REG_EAX);
+
+ //上位32ビットをedxにロード
+ pRelativeVar->offset+=sizeof(long);
+ SetReg_WholeVariable(DEF_LONG,pRelativeVar,REG_EDX);
+ pRelativeVar->offset-=sizeof(long);
+
+ return;
+ }
+
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //mov reg, ptr[ecx+offset]
+ op_mov_RM(var_size,reg,REG_ECX,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov reg, ptr[offset]
+ op_mov_RM(var_size,reg,0,(int)pRelativeVar->offset,MOD_DISP32);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //mov reg, ptr[ebp+ecx+offset]
+ op_mov_RM_ex(var_size,reg,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov reg, ptr[ebp+offset]
+ op_mov_RM(var_size,reg,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add ecx,qword ptr[ebp+offset]
+ op_add_RM(var_size,REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ecx,qword ptr[ebp+offset]
+ op_mov_RM(var_size,REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ goto directmem;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+ //mov reg, ptr[ecx]
+ op_mov_RM(var_size,reg,REG_ECX,0,MOD_BASE);
+ }
+}
+
+
+
+
+
+void PushDoubleVariable(RELATIVE_VAR *pRelativeVar){
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //push dword ptr[ecx+offset+sizeof(long)]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xB1;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset+sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+
+ //push dword ptr[ecx+offset]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xB1;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //push dword ptr[offset+sizeof(long)]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x35;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset+sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+
+ //push dword ptr[offset]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x35;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add ecx,offset+sizeof(long)
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset+sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //push dword ptr[ebp+ecx]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x74;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+
+ //sub ecx,sizeof(long)
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xE9;
+ OpBuffer[obp++]=(char)0x04;
+
+ //push dword ptr[ebp+ecx]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x74;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //push dword ptr[ebp+offset+sizeof(long)]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xB5;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset+sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //push dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xB5;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ //mov eax,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ if(pRelativeVar->bOffsetOffset){
+ //add eax,ecx
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xC1;
+ }
+
+ //push dword ptr[eax+sizeof(long)]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x70;
+ OpBuffer[obp++]=(char)0x04;
+
+ //push dword ptr[eax]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x30;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+ //push dword ptr[ecx+sizeof(long)]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xB1;
+ *((long *)(OpBuffer+obp))=sizeof(long);
+ obp+=sizeof(long);
+
+ //push dword ptr[ecx]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x31;
+ }
+}
+void PushLongVariable(RELATIVE_VAR *pRelativeVar){
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //push dword ptr[ecx+offset]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xB1;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //push dword ptr[offset]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x35;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //push dword ptr[ebp+ecx]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x74;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //push dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xB5;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ //mov eax,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ if(pRelativeVar->bOffsetOffset){
+ //add eax,ecx
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xC1;
+ }
+
+ //push dword ptr[eax]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x30;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+ //push dword ptr[ecx]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x31;
+ }
+}
+void PushIntegerVariable(RELATIVE_VAR *pRelativeVar){
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //movsx eax,word ptr[ecx+offset]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)0x81;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //movsx eax,word ptr[offset]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)0x05;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //movsx eax,word ptr[ebp+ecx]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //movsx eax,word ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ //mov ebx,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x9D;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ if(pRelativeVar->bOffsetOffset){
+ //add ebx,ecx
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xD9;
+ }
+
+ //movsx eax,word ptr[ebx]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)0x03;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+ //movsx eax,word ptr[ecx]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)0x01;
+ }
+
+ //push eax
+ op_push(REG_EAX);
+}
+void PushWordVariable(RELATIVE_VAR *pRelativeVar){
+ //xor eax,eax(eaxを0に初期化する)
+ op_zero_reg(REG_EAX);
+
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //mov ax,word ptr[ecx+offset]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x81;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ax,word ptr[offset]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0xA1;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //mov ax,word ptr[ebp+ecx]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //mov ax,word ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ //mov ebx,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x9D;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ if(pRelativeVar->bOffsetOffset){
+ //add ebx,ecx
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xD9;
+ }
+
+ //mov ax,word ptr[ebx]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x03;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+ //mov ax,word ptr[ecx]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x01;
+ }
+
+ //push eax
+ op_push(REG_EAX);
+}
+void PushCharVariable(RELATIVE_VAR *pRelativeVar){
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //movsx eax,byte ptr[ecx+offset]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0x81;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //movsx eax,byte ptr[offset]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0x05;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //movsx eax,byte ptr[ebp+ecx]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //movsx eax,byte ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ //mov ebx,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x9D;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ if(pRelativeVar->bOffsetOffset){
+ //add ebx,ecx
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xD9;
+ }
+
+ //movsx eax,byte ptr[ebx]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0x03;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+ //movsx eax,byte ptr[ecx]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0x01;
+ }
+
+ //push eax
+ op_push(REG_EAX);
+}
+void PushByteVariable(RELATIVE_VAR *pRelativeVar){
+ //xor eax,eax(eaxを0に初期化する)
+ op_zero_reg(REG_EAX);
+
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //mov al,byte ptr[ecx+offset]
+ OpBuffer[obp++]=(char)0x8A;
+ OpBuffer[obp++]=(char)0x81;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov al,byte ptr[offset]
+ OpBuffer[obp++]=(char)0xA0;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //mov al,byte ptr[ebp+ecx]
+ OpBuffer[obp++]=(char)0x8A;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //mov al,byte ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8A;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ //mov ebx,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x9D;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ if(pRelativeVar->bOffsetOffset){
+ //add ebx,ecx
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xD9;
+ }
+
+ //mov al,byte ptr[ebx]
+ OpBuffer[obp++]=(char)0x8A;
+ OpBuffer[obp++]=(char)0x03;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+ //mov al,byte ptr[ecx]
+ OpBuffer[obp++]=(char)0x8A;
+ OpBuffer[obp++]=(char)0x01;
+ }
+
+ //push eax
+ op_push(REG_EAX);
+}
Index: /BasicCompiler32/Compile_CallProc.cpp
===================================================================
--- /BasicCompiler32/Compile_CallProc.cpp (revision 3)
+++ /BasicCompiler32/Compile_CallProc.cpp (revision 3)
@@ -0,0 +1,516 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+//ローカル変数アドレススケジュール
+DWORD *pLocalVarAddrSchedule;
+int LocalVarAddrScheduleNum;
+
+void Call_DebugSys_SaveContext(){
+ //call _System_GetEip
+ extern SUBINFO *pSub_System_GetEip;
+ op_call(pSub_System_GetEip);
+
+ //push eax
+ op_push(REG_EAX);
+
+ //push ebp
+ op_push(REG_EBP);
+
+ //call _DebugSys_SaveContext
+ extern SUBINFO *pSub_DebugSys_SaveContext;
+ op_call(pSub_DebugSys_SaveContext);
+}
+
+void AddLocalVarAddrSchedule(){
+ extern HANDLE hHeap;
+
+ //ローカル変数アドレススケジュールに追加する
+ pLocalVarAddrSchedule=(DWORD *)HeapReAlloc(hHeap,0,pLocalVarAddrSchedule,(LocalVarAddrScheduleNum+1)*sizeof(DWORD));
+ pLocalVarAddrSchedule[LocalVarAddrScheduleNum]=obp;
+ LocalVarAddrScheduleNum++;
+}
+int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
+ int ret_type;
+
+ if(idProc==PROC_DEFAULT){
+ /////////////////////
+ // ユーザー定義関数
+ /////////////////////
+
+ SUBINFO *psi;
+ psi=(SUBINFO *)pInfo;
+
+ //GetSubHash内でエラー提示が行われた場合
+ if(psi==(SUBINFO *)-1) return -1;
+
+
+ //オブジェクト名を取得
+ char ObjectName[VN_SIZE];
+ int RefType;
+ GetObjectName(name,ObjectName,&RefType);
+
+
+ ////////////////////////
+ // オーバーロードを解決
+ ////////////////////////
+
+ SUBINFO **ppsi;
+ int num;
+ ppsi=GetOverloadSubHash(name,&num);
+ if(num){
+ //オーバーロードを解決
+ psi=OverloadSolutionWithStrParam(name,ppsi,num,Parameter,ObjectName,NULL);
+ HeapDefaultFree(ppsi);
+
+ if(!psi) return 0;
+ }
+
+
+ ret_type=Opcode_CallProc(Parameter,psi,plpRetIndex,0,ObjectName,RefType);
+ }
+ else if(idProc==PROC_DLL){
+ /////////////////////////
+ // DLL関数
+ /////////////////////////
+ DECLAREINFO *pdi;
+ pdi=(DECLAREINFO *)pInfo;
+
+ ret_type=Opcode_CallDllProc(Parameter,pdi,plpRetIndex);
+ }
+ else if(idProc==PROC_BUILTIN){
+ /////////////////////////
+ // 組み込み関数
+ /////////////////////////
+ int FuncId;
+ FuncId=(int)(_int64)pInfo;
+
+ ret_type=Opcode_CallFunc(Parameter,FuncId);
+ }
+ else if(idProc==PROC_PTR){
+ /////////////////
+ // 関数ポインタ
+ /////////////////
+
+ LONG_PTR lpIndex;
+ GetVarType(name,&lpIndex,0);
+
+ extern PROCPTRINFO *pProcPtrInfo;
+ ret_type=Opcode_CallProcPtr(name,Parameter,&pProcPtrInfo[lpIndex],plpRetIndex);
+ }
+
+ return ret_type;
+}
+
+BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
+ //プロパティ用のメソッドを呼び出す
+
+ //配列要素を取得
+ char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+ GetArrayElement(variable,VarName,ArrayElements);
+
+ //オブジェクト名を取得
+ char ObjectName[VN_SIZE];
+ int RefType;
+ GetObjectName(VarName,ObjectName,&RefType);
+
+ //オーバーロード用の関数リストを作成
+ SUBINFO **ppsi;
+ int num;
+ ppsi=GetOverloadSubHash(VarName,&num);
+ if(num==0){
+ return 0;
+ }
+
+ //パラメータを整備
+ char *Parameter;
+ Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(RightSide)+32);
+ lstrcpy(Parameter,ArrayElements);
+ if(RightSide){
+ if(Parameter[0]&&RightSide[0]) lstrcat(Parameter,",");
+ lstrcat(Parameter,RightSide);
+ }
+
+ //オーバーロードを解決
+ SUBINFO *psi;
+ psi=OverloadSolutionWithStrParam(VarName,ppsi,num,Parameter,ObjectName,NULL);
+ HeapDefaultFree(ppsi);
+
+ if(psi){
+ //呼び出し
+ int type;
+ LONG_PTR lpIndex;
+ type=Opcode_CallProc(Parameter,psi,&lpIndex,0,ObjectName,RefType);
+
+ if(pRetTypeInfo){
+ pRetTypeInfo->type=type;
+ pRetTypeInfo->u.lpIndex=lpIndex;
+ }
+ }
+
+ HeapDefaultFree(Parameter);
+
+ return 1;
+}
+
+
+int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex){
+ extern HANDLE hHeap;
+ int i;
+
+
+ extern BOOL bDebugCompile;
+ extern BOOL bDebugSupportProc;
+ if(bDebugCompile&&bDebugSupportProc==0)
+ Call_DebugSys_SaveContext();
+
+
+ ////////////////////////
+ // パラメータのセット
+ ////////////////////////
+
+ //パラメータオブジェクトを生成
+ CParameter *pobj_parameter=0;
+ pobj_parameter=new CParameter(Parameter);
+
+ //エラーチェック
+ pobj_parameter->ErrorCheck(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum);
+
+ //レジスタ、スタックフレームにセット
+ pobj_parameter->SetParameter(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum);
+
+ //パラメータオブジェクトを破棄
+ delete pobj_parameter;
+
+
+ RELATIVE_VAR RelativeVar;
+ LONG_PTR lp;
+ GetVarOffset(1,variable,&i,&RelativeVar,&lp);
+ SetVarPtrToEax(&RelativeVar);
+
+ //mov eax,dword ptr[eax]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x00;
+
+ //call eax
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xD0;
+
+ if(plpIndex) *plpIndex=pi->u.ReturnIndex;
+
+ return pi->ReturnType;
+}
+
+int Opcode_CallProc(char *Parameter,SUBINFO *psi,LONG_PTR *plpIndex,DWORD dwFlags,char *ObjectName,int RefType){
+ int i,i2;
+
+ if(psi->dwType==SUBTYPE_MACRO){
+ if(lstrcmpi(psi->name,"Print")==0){
+ Opcode_Print(Parameter,0);
+ return -1;
+ }
+ if(lstrcmpi(psi->name,"Input")==0){
+ Opcode_Input(Parameter);
+ return -1;
+ }
+ if(lstrcmpi(psi->name,"Write")==0){
+ Opcode_Print(Parameter,1);
+ return -1;
+ }
+ }
+
+ psi->bUse=1;
+
+ BOOL bStatic=0;
+ CClass *pobj_c;
+ if(psi->pobj_ParentClass){
+ //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う
+ if(ObjectName[0]){
+ if(lstrcmpi(ObjectName,"Super")==0){
+ //クラスメンバ関数内からスーパークラスの呼び出し
+ pobj_c=pobj_CompilingClass;
+ }
+ else{
+ pobj_c=pobj_DBClass->check(ObjectName);
+ if(pobj_c){
+ //静的メンバ
+ bStatic=1;
+ }
+ else{
+ //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
+ GetVarType(ObjectName,(LONG_PTR *)&pobj_c,1);
+ }
+ }
+ }
+ else{
+ if(dwFlags&PROCFLAG_NEW){
+ //New演算子によるコンストラクタ呼び出し
+ pobj_c=psi->pobj_ParentClass;
+ }
+ else{
+ //クラスメンバ関数内から同一クラスのメンバ関数の呼び出し
+ pobj_c=pobj_CompilingClass;
+ }
+ }
+
+
+ DWORD dwAccess;
+ for(i=0;iiMethodNum;i++){
+ if(psi==pobj_c->ppobj_Method[i]->psi) break;
+ }
+ if(i==pobj_c->iMethodNum){
+ for(i=0;iiStaticMethodNum;i++){
+ if(psi==pobj_c->ppobj_StaticMethod[i]->psi) break;
+ }
+ dwAccess=pobj_c->ppobj_StaticMethod[i]->dwAccess;
+
+ bStatic=1;
+ }
+ else dwAccess=pobj_c->ppobj_Method[i]->dwAccess;
+
+
+ //////////////////////////////
+ // アクセスエラーチェック
+ //////////////////////////////
+
+ if(ObjectName[0]){
+ //外部からの呼び出し
+ if(pobj_c==pobj_CompilingClass){
+ //同一クラスオブジェクトの場合はプライベートアクセスを容認する
+ if(dwAccess==ACCESS_NON){
+ SetError(109,psi->name,cp);
+ return -1;
+ }
+ }
+ else{
+ if(dwAccess==ACCESS_PRIVATE||
+ dwAccess==ACCESS_NON){
+ SetError(109,psi->name,cp);
+ return -1;
+ }
+ if(dwAccess==ACCESS_PROTECTED){
+ SetError(110,psi->name,cp);
+ return -1;
+ }
+ }
+ }
+ else{
+ //クラス内部からの呼び出し(継承によるACCESS_NONのみをエラーとする)
+ if(dwAccess==ACCESS_NON){
+ SetError(109,psi->name,cp);
+ return -1;
+ }
+ }
+ }
+
+
+
+ ///////////////////////////////////////////////////////////////
+ // _System_LocalThis、_System_ReturnObjectのダミーをセット
+ ///////////////////////////////////////////////////////////////
+
+ char temporary[VN_SIZE]={0};
+ if(psi->pobj_ParentClass&&bStatic==0){
+ //_System_LocalThis(第一パラメータ)のダミーを作成
+ lstrcpy(temporary,"0,");
+ }
+
+ if(psi->ReturnType==DEF_OBJECT){
+ //_System_ReturnObject(第一または第二パラメータのダミーを作成)
+ sprintf(temporary+lstrlen(temporary),"%c%c0,",1,ESC_BYVAL);
+ }
+
+ if(Parameter[0]=='\0'&&temporary[0])
+ temporary[lstrlen(temporary)-1]=0;
+ else lstrcat(temporary,Parameter);
+
+
+
+ ////////////////////////
+ // パラメータをセット
+ ////////////////////////
+
+ //パラメータオブジェクトを生成
+ CParameter *pobj_parameter=0;
+ pobj_parameter=new CParameter(temporary);
+
+ //エラーチェック
+ pobj_parameter->ErrorCheck(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum);
+
+ if(psi->dwType==SUBTYPE_MACRO){
+ //マクロ関数の場合は、パラメータ省略を考慮する
+ pobj_parameter->MacroParameterSupport(psi->pRealParmInfo);
+ }
+
+ //レジスタ、スタックフレームにセット
+ int ParmSize;
+ ParmSize=pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum);
+
+ //パラメータオブジェクトを破棄
+ delete pobj_parameter;
+
+
+
+ if(psi->ReturnType==DEF_OBJECT){
+ //////////////////////////////////////////////////////
+ // 戻り値にオブジェクト インスタンスを持つ場合
+ // ※ByRef _System_ReturnObject パラメータをセット
+ //////////////////////////////////////////////////////
+
+ int object_size;
+ object_size=GetSizeOfClass(psi->u.Return_pobj_c);
+
+ //push object_size
+ op_push_value(object_size);
+
+ //call calloc
+ extern SUBINFO *pSub_calloc;
+ op_call(pSub_calloc);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+
+
+ if(psi->pobj_ParentClass&&bStatic==0){
+ //////////////////////////////////////////////////////
+ // メンバ関数の場合
+ // ※_System_LocalThis パラメータをセット
+ //////////////////////////////////////////////////////
+
+ if(ObjectName[0]){
+ if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember;
+
+ RELATIVE_VAR RelativeVar;
+ if(!GetVarOffset(1,ObjectName,&i2,&RelativeVar,0)) return -1;
+ SetVarPtrToEax(&RelativeVar);
+
+ //参照タイプが整合しているかをチェック
+ if(i2!=RefType) SetError(104,ObjectName,cp);
+
+ if(i2==DEF_PTR_OBJECT){
+ //mov eax,dword ptr[eax]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x00;
+ }
+
+ //mov ecx,eax
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0xC8;
+ }
+ else{
+InClassMember:
+ if(dwFlags&PROCFLAG_NEW){
+ //New演算子によるコンストラクタ呼び出しの場合
+ //mov ecx,dword ptr[esp+ParmSize]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x8C;
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=ParmSize;
+ obp+=sizeof(long);
+ }
+ else{
+ //Thisポインタをecxにコピー
+ SetThisPtrToReg(REG_ECX);
+ }
+ }
+
+ //push ecx
+ op_push(REG_ECX);
+ }
+
+ if(psi->bVirtual){
+ //仮想関数(オブジェクトメソッド)呼び出し
+ //pObj->func_table->func1
+ // ->func2
+ // ->func3
+
+ //mov edx,dword ptr[ecx]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x11;
+
+ for(i=0,i2=0;iiMethodNum;i++){
+ if(pobj_c->ppobj_Method[i]->psi==psi) break;
+ if(pobj_c->ppobj_Method[i]->psi->bVirtual) i2++;
+ }
+
+ //call dword ptr[edx+func_index]
+ if(i2*PTR_SIZE<=0x7F){
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x52;
+ OpBuffer[obp++]=(char)(i2*PTR_SIZE);
+ }
+ else{
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x92;
+ *((long *)(OpBuffer+obp))=i2*PTR_SIZE;
+ obp+=sizeof(long);
+ }
+ }
+ else{
+ //通常呼び出し
+
+ //call ProcAddr
+ op_call(psi);
+ }
+
+ if(psi->bCdecl){
+ //add esp,ParmSize
+ op_add_esp(ParmSize);
+ }
+
+ if(plpIndex) *plpIndex=psi->u.ReturnIndex;
+
+ return psi->ReturnType;
+}
+
+int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex){
+ char *temporary;
+
+ temporary=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter)+1);
+
+ extern BOOL bDebugCompile;
+ extern BOOL bDebugSupportProc;
+ if(bDebugCompile&&bDebugSupportProc==0&&lstrcmp(pdi->name,"DebugBreak")!=0)
+ Call_DebugSys_SaveContext();
+
+ pdi->bUse=1;
+
+
+ ////////////////////////
+ // パラメータのセット
+ ////////////////////////
+
+ //パラメータオブジェクトを生成
+ CParameter *pobj_parameter=0;
+ pobj_parameter=new CParameter(Parameter);
+
+ //エラーチェック
+ pobj_parameter->ErrorCheck(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum);
+
+ //レジスタ、スタックフレームにセット
+ int ParmSize;
+ ParmSize=pobj_parameter->SetParameter(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum);
+
+ //パラメータオブジェクトを破棄
+ delete pobj_parameter;
+
+
+ //動的リンクされたプロシージャの呼び出し
+
+ //call dword ptr[LookupTable]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x15;
+ pobj_ImportAddrSchedule->add(pdi);
+ obp+=sizeof(long);
+
+ if(pdi->bCdecl){
+ //add esp,ParmSize
+ op_add_esp(ParmSize);
+ }
+
+ if(plpIndex) *plpIndex=pdi->u.ReturnIndex;
+
+ HeapDefaultFree(temporary);
+
+ return pdi->ReturnType;
+}
Index: /BasicCompiler32/Compile_Func.cpp
===================================================================
--- /BasicCompiler32/Compile_Func.cpp (revision 3)
+++ /BasicCompiler32/Compile_Func.cpp (revision 3)
@@ -0,0 +1,481 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+int GetFunctionType(int FuncNum){
+ switch(FuncNum){
+ case FUNC_CUDBL:
+ return DEF_DOUBLE;
+ case FUNC_FIX:
+ case FUNC_LEN:
+ return DEF_LONG;
+ case FUNC_ADDRESSOF:
+ case FUNC_SIZEOF:
+ case FUNC_VARPTR:
+ return DEF_DWORD;
+ case FUNC_GETDOUBLE:
+ return DEF_DOUBLE;
+ case FUNC_GETSINGLE:
+ return DEF_SINGLE;
+ case FUNC_GETQWORD:
+ return DEF_QWORD;
+ case FUNC_GETDWORD:
+ return DEF_DWORD;
+ case FUNC_GETWORD:
+ return DEF_WORD;
+ case FUNC_GETBYTE:
+ return DEF_BYTE;
+ }
+ return 0;
+}
+int GetFunctionFromName(char *FuncName){
+ if(lstrcmpi(FuncName,"CUDbl")==0) return FUNC_CUDBL;
+ if(lstrcmpi(FuncName,"Fix")==0) return FUNC_FIX;
+ if(lstrcmpi(FuncName,"Len")==0) return FUNC_LEN;
+ if(lstrcmpi(FuncName,"AddressOf")==0) return FUNC_ADDRESSOF;
+ if(lstrcmpi(FuncName,"SizeOf")==0) return FUNC_SIZEOF;
+ if(lstrcmpi(FuncName,"VarPtr")==0) return FUNC_VARPTR;
+ if(lstrcmpi(FuncName,"GetDouble")==0) return FUNC_GETDOUBLE;
+ if(lstrcmpi(FuncName,"GetSingle")==0) return FUNC_GETSINGLE;
+ if(lstrcmpi(FuncName,"GetQWord")==0) return FUNC_GETQWORD;
+ if(lstrcmpi(FuncName,"GetDWord")==0) return FUNC_GETDWORD;
+ if(lstrcmpi(FuncName,"GetWord")==0) return FUNC_GETWORD;
+ if(lstrcmpi(FuncName,"GetByte")==0) return FUNC_GETBYTE;
+ return 0;
+}
+
+void Opcode_Func_Fix(char *Parameter){
+ int i;
+
+ i=NumOpe(Parameter,0,0,0);
+
+ if(i==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //fnstcw word ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //mov ax,word ptr[esp]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+
+ //or ah,0Ch
+ OpBuffer[obp++]=(char)0x80;
+ OpBuffer[obp++]=(char)0xCC;
+ OpBuffer[obp++]=(char)0x0C;
+
+ //mov word ptr[esp-2],ax
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0xFE;
+
+ //fldcw word ptr[esp-2]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x6C;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0xFE;
+
+ //fistp dword ptr[esp+4]
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x5C;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0x04;
+
+ //fldcw word ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x2C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(i==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //fnstcw word ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //mov ax,word ptr[esp]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+
+ //or ah,0Ch
+ OpBuffer[obp++]=(char)0x80;
+ OpBuffer[obp++]=(char)0xCC;
+ OpBuffer[obp++]=(char)0x0C;
+
+ //mov word ptr[esp-2],ax
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0xFE;
+
+ //fldcw word ptr[esp-2]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x6C;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0xFE;
+
+ //fistp dword ptr[esp+4]
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x5C;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0x04;
+
+ //fldcw word ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x2C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(Is64Type(i)){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+
+ //pop eax
+ op_pop(REG_EAX);
+}
+
+void Opcode_Func_CUDbl(char *Parameter){
+ int i;
+
+ i=NumOpe(Parameter,0,0,0);
+ ChangeTypeToLong(i);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //push 0
+ OpBuffer[obp++]=(char)0x6A;
+ OpBuffer[obp++]=(char)0x00;
+
+ //push eax
+ op_push(REG_EAX);
+
+ //fild qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x2C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //add esp,8
+ op_add_esp(8);
+}
+void Opcode_Func_Len(char *Parameter){
+ int type,TypeSize;
+ LONG_PTR lpIndex;
+ BOOL bArrayHead;
+
+ type=GetVarType(Parameter,&lpIndex,0);
+
+ char *tempParm=Parameter;
+ char temporary[VN_SIZE];
+ char temp2[32];
+ if(type==-1){
+ sprintf(temporary,"_System_DummyStr2=%s",Parameter);
+ OpcodeCalc(temporary);
+
+ lstrcpy(temp2,"_System_DummyStr2");
+ tempParm=temp2;
+
+ extern CClass *pobj_StringClass;
+ type=DEF_OBJECT;
+ lpIndex=(LONG_PTR)pobj_StringClass;
+ }
+
+ TYPEINFO TypeInfo={type,lpIndex};
+ if(IsStringObjectType(&TypeInfo)){
+ //Stringオブジェクトの場合
+ char temporary[VN_SIZE];
+ sprintf(temporary,"%s.Length",tempParm);
+
+ NumOpe(temporary,0,0,NULL,NULL);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ return;
+ }
+
+ int SubScripts[MAX_ARRAYDIM];
+ RELATIVE_VAR RelativeVar;
+ if(!GetVarOffset(1,tempParm,&type,&RelativeVar,&lpIndex,SubScripts)) return;
+
+ if(type&FLAG_PTR){
+ type&=~FLAG_PTR;
+
+ bArrayHead=1;
+ }
+ else bArrayHead=0;
+
+ TypeSize=GetTypeSize(type,lpIndex);
+
+ if(bArrayHead) TypeSize*=JumpSubScripts(SubScripts);
+
+ //mov eax,TypeSize
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=TypeSize;
+ obp+=sizeof(long);
+}
+void Opcode_Func_AddressOf(char *name){
+ extern int cp;
+ SUBINFO *psi;
+
+ extern LONG_PTR ProcPtr_BaseIndex;
+ if(ProcPtr_BaseIndex!=-1){
+ //左辺の型にのっとり、オーバーロードを解決
+
+ SUBINFO **ppsi;
+ int num;
+ ppsi=GetOverloadSubHash(name,&num);
+ if(!num){
+ HeapDefaultFree(ppsi);
+
+ SetError(27,name,cp);
+ return;
+ }
+
+ //オーバーロードを解決
+ extern PROCPTRINFO *pProcPtrInfo;
+ psi=OverloadSolution(name,ppsi,num,pProcPtrInfo[ProcPtr_BaseIndex].pParmInfo,pProcPtrInfo[ProcPtr_BaseIndex].ParmNum,NULL);
+ HeapDefaultFree(ppsi);
+
+ if(!psi){
+ SetError(27,name,cp);
+ return;
+ }
+ }
+ else{
+ psi=GetSubHash(name);
+ if(!psi){
+ SetError(27,name,cp);
+ return;
+ }
+ }
+
+
+ if(psi->bVirtual){
+ ///////////////////////////////
+ // 仮想関数の場合
+ // thisポインタをrcxにコピー
+ ///////////////////////////////
+
+ CClass *pobj_c;
+
+ char ObjectName[VN_SIZE];
+ int RefType;
+ GetObjectName(name,ObjectName,&RefType);
+
+ if(ObjectName[0]){
+ if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember;
+ else{
+ RELATIVE_VAR RelativeVar;
+ int type;
+ if(!GetVarOffset(1,ObjectName,&type,&RelativeVar,(LONG_PTR *)&pobj_c)) return;
+ SetVarPtrToEax(&RelativeVar);
+
+ //mov ecx,eax
+ op_mov_RR(REG_ECX,REG_EAX);
+
+ //参照タイプが整合しているかをチェック
+ if(type!=RefType) SetError(104,ObjectName,cp);
+
+ if(type==DEF_PTR_OBJECT){
+ //mov ecx,dword ptr[ecx]
+ op_mov_RM(sizeof(long),REG_ECX,REG_ECX,0,MOD_BASE);
+ }
+ }
+ }
+ else{
+InClassMember:
+ //自身のオブジェクトのThisポインタをrcxにコピー
+ SetThisPtrToReg(REG_RCX);
+
+ pobj_c=pobj_CompilingClass;
+ }
+
+
+ //仮想関数(オブジェクトメソッド)
+ //pObj->func_table->func1
+ // ->func2
+ // ->func3
+
+ //mov edx,dword ptr[ecx]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x11;
+
+ int i,i2;
+ for(i=0,i2=0;iiMethodNum;i++){
+ if(pobj_c->ppobj_Method[i]->psi==psi) break;
+ if(pobj_c->ppobj_Method[i]->psi->bVirtual) i2++;
+ }
+
+ //mov eax,dword ptr[edx+func_index]
+ if(i2*PTR_SIZE<=0x7F){
+ op_mov_RM(sizeof(long),REG_EAX,REG_EDX,i2*PTR_SIZE,MOD_BASE_DISP8);
+ }
+ else{
+ op_mov_RM(sizeof(long),REG_EAX,REG_EDX,i2*PTR_SIZE,MOD_BASE_DISP32);
+ }
+ }
+ else{
+ //一般の関数
+
+ //mov eax,ProcAddr
+ OpBuffer[obp++]=(char)0xB8;
+ pobj_SubAddrSchedule->add(psi,0);
+ obp+=sizeof(long);
+ }
+
+ psi->bUse=1;
+}
+void Opcode_Func_SizeOf(char *Parameter){
+ int type,size;
+ LONG_PTR lpIndex;
+
+ type=GetTypeFixed(Parameter,&lpIndex);
+ if(type==-1){
+ extern int cp;
+ SetError(3,Parameter,cp);
+ return;
+ }
+ size=GetTypeSize(type,lpIndex);
+
+ //mov eax,size
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=size;
+ obp+=sizeof(long);
+}
+void Opcode_Func_VarPtr(char *Parameter){
+ int type;
+ RELATIVE_VAR RelativeVar;
+
+ //変数のアドレスを取得
+ if(!GetVarOffset(1,Parameter,&type,&RelativeVar,0)) return;
+
+ SetVarPtrToEax(&RelativeVar);
+}
+void Opcode_Func_GetPtrData(char *Parameter,int type){
+ int i2;
+
+ i2=NumOpe(Parameter,0,0,0);
+ ChangeTypeToLong(i2);
+
+ if(type==DEF_DOUBLE){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //fld qword ptr[eax]
+ OpBuffer[obp++]=(char)0xDD;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else if(type==DEF_SINGLE||type==DEF_DWORD){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //mov eax,dword ptr[eax]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else if(type==DEF_QWORD){
+ //pop ecx
+ op_pop(REG_ECX);
+
+ //mov eax,dword ptr[ecx]
+ op_mov_RM(sizeof(long),REG_EAX,REG_ECX,0,MOD_BASE);
+
+ //mov edx,dword ptr[ecx+sizeof(long)]
+ op_mov_RM(sizeof(long),REG_EDX,REG_ECX,sizeof(long),MOD_BASE_DISP8);
+ }
+ else if(type==DEF_WORD){
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //xor eax,eax
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //mov ax,word ptr[ebx]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x03;
+ }
+ else if(type==DEF_BYTE){
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //xor eax,eax
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //mov al,byte ptr[ebx]
+ OpBuffer[obp++]=(char)0x8A;
+ OpBuffer[obp++]=(char)0x03;
+ }
+}
+
+int Opcode_CallFunc(char *Parameter,int FuncNum){
+ switch(FuncNum){
+ case FUNC_FIX:
+ Opcode_Func_Fix(Parameter);
+ return DEF_LONG;
+ case FUNC_CUDBL:
+ Opcode_Func_CUDbl(Parameter);
+ return DEF_DOUBLE;
+ case FUNC_LEN:
+ Opcode_Func_Len(Parameter);
+ return DEF_LONG;
+ case FUNC_ADDRESSOF:
+ Opcode_Func_AddressOf(Parameter);
+ return DEF_PTR_VOID;
+ case FUNC_SIZEOF:
+ Opcode_Func_SizeOf(Parameter);
+ return DEF_LONG;
+ case FUNC_VARPTR:
+ Opcode_Func_VarPtr(Parameter);
+ return DEF_PTR_VOID;
+
+ case FUNC_GETDOUBLE:
+ Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
+ return DEF_DOUBLE;
+ case FUNC_GETSINGLE:
+ Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
+ return DEF_SINGLE;
+ case FUNC_GETQWORD:
+ Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
+ return DEF_QWORD;
+ case FUNC_GETDWORD:
+ Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
+ return DEF_DWORD;
+ case FUNC_GETWORD:
+ Opcode_Func_GetPtrData(Parameter,DEF_WORD);
+ return DEF_WORD;
+ case FUNC_GETBYTE:
+ Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
+ return DEF_BYTE;
+ }
+ return 0;
+}
Index: /BasicCompiler32/Compile_Object.cpp
===================================================================
--- /BasicCompiler32/Compile_Object.cpp (revision 3)
+++ /BasicCompiler32/Compile_Object.cpp (revision 3)
@@ -0,0 +1,361 @@
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+void CallConstructor(CClass *pobj_c,char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
+ ////////////////////////////
+ // コンストラクタの呼び出し
+ ////////////////////////////
+
+ //この関数を使用する場合は、
+ //・ebxにオブジェクトの個数
+ //・eaxに先頭ポインタ
+ //をセットしておかなければならない
+
+ int jnz_back;
+
+
+ //jnzの番地
+ jnz_back=obp;
+
+ //push ebx
+ op_push(REG_EBX);
+
+ // ※ここでプッシュされた値はコンストラクタのthisポインタとなる
+ //push eax
+ op_push(REG_EAX);
+
+
+
+ ////////////////////////
+ // オーバーロードを解決
+ ////////////////////////
+
+ SUBINFO **ppsi;
+ SUBINFO *psi;
+ int num;
+ ppsi=GetOverloadObjectSubHash(pobj_c->name,pobj_c,&num);
+ if(num){
+ //オーバーロードを解決
+ psi=OverloadSolutionWithStrParam(pobj_c->name,
+ ppsi,num,CreateParameter,"",NULL);
+ HeapDefaultFree(ppsi);
+
+ if(!psi) return;
+ }
+
+ //コンストラクタを呼び出す
+ Opcode_CallProc(CreateParameter,
+ psi,
+ 0,
+ PROCFLAG_NEW,"",0);
+
+
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ if(bSomeObjects){
+ //add eax,TypeSize
+ OpBuffer[obp++]=(char)0x05;
+ *((long *)(OpBuffer+obp))=ObjectSize;
+ obp+=sizeof(long);
+
+ //sub ebx,1
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xEB;
+ OpBuffer[obp++]=(char)0x01;
+
+ //jnz ↑
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=jnz_back-(obp+sizeof(long));
+ obp+=sizeof(long);
+ }
+}
+int Operator_New(char *Parameter,LONG_PTR *plpIndex){
+ char TypeName[VN_SIZE],CreateParameter[VN_SIZE],ObjectSize[VN_SIZE];
+ int i,i2;
+
+ i=0;
+
+ if(Parameter[0]=='['){
+ i=GetStringInBracket(ObjectSize,Parameter);
+
+ SlideString(ObjectSize+1,-1);
+ ObjectSize[i-2]=0;
+ }
+ else ObjectSize[0]=0;
+
+ for(i2=0;;i++,i2++){
+ if(Parameter[i]=='('){
+ TypeName[i2]=0;
+
+ //コンストラクタに渡すパラメータを取得
+ i2=GetStringInPare(CreateParameter,Parameter+i);
+ RemoveStringPare(CreateParameter);
+ i+=i2;
+ if(Parameter[i]!='\0'){
+ SetError(42,NULL,cp);
+ return -1;
+ }
+ break;
+ }
+ TypeName[i2]=Parameter[i];
+ if(Parameter[i]=='\0'){
+ CreateParameter[0]=0;
+ break;
+ }
+ }
+
+ int type,TypeSize;
+ type=GetTypeFixed(TypeName,plpIndex);
+ if(type==-1){
+ SetError(3,TypeName,cp);
+ return -1;
+ }
+ TypeSize=GetTypeSize(type,*plpIndex);
+
+ if(type!=DEF_OBJECT){
+ ////////////////////////
+ // 通常のデータ型の場合
+ ////////////////////////
+
+ SetError(121,NULL,cp);
+ return -1;
+ }
+
+ CClass *pobj_c;
+ pobj_c=(CClass *)*plpIndex;
+
+ if(pobj_c->IsHoldAbstractFunction()){
+ //抽象クラスだったとき
+ SetError(125,pobj_c->name,cp);
+ }
+
+ if(ObjectSize[0]){
+ i2=NumOpe(ObjectSize,0,0,0);
+ ChangeTypeToLong(i2);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //※添え字上限値であることを考慮
+ //add eax,1
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xC0;
+ OpBuffer[obp++]=(char)0x01;
+
+ //オブジェクトの個数をebxに一時保持
+ //※ebxは関数が呼ばれても不変
+ //mov ebx,eax
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0xD8;
+
+ //imul eax,size
+ OpBuffer[obp++]=(char)0x69;
+ OpBuffer[obp++]=(char)0xC0;
+ *((long *)(OpBuffer+obp))=TypeSize;
+ obp+=sizeof(long);
+
+ //add eax,sizeof(DWORD)*2
+ OpBuffer[obp++]=(char)0x05;
+ *((long *)(OpBuffer+obp))=sizeof(DWORD)*3;
+ obp+=sizeof(long);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else{
+ //オブジェクトの個数をebxに一時保持
+ //※ebxは関数が呼ばれても不変
+ //mov ebx,1
+ OpBuffer[obp++]=(char)0xBB;
+ *((long *)(OpBuffer+obp))=1;
+ obp+=sizeof(long);
+
+ //push size
+ OpBuffer[obp++]=(char)0x68;
+ *((long *)(OpBuffer+obp))=TypeSize+sizeof(DWORD)*3;
+ obp+=sizeof(long);
+ }
+
+ //call calloc
+ extern SUBINFO *pSub_calloc;
+ op_call(pSub_calloc);
+
+
+ /*
+ 確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、
+ pPtr-=sizeof(DWORD)*3
+ pPtr[0]=オブジェクトの個数
+ pPtr[1]=オブジェクトのサイズ
+ pPtr[2]=デストラクタの関数ポインタ
+ */
+
+
+ //mov dword ptr[eax],ebx(オブジェクトの個数)
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x18;
+
+ //add eax,sizeof(DWORD)
+ OpBuffer[obp++]=(char)0x05;
+ *((long *)(OpBuffer+obp))=sizeof(DWORD);
+ obp+=sizeof(long);
+
+
+ //mov ecx,TypeSize
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=TypeSize;
+ obp+=sizeof(long);
+
+ //mov dword ptr[eax],ecx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x08;
+
+ //add eax,sizeof(DWORD)
+ OpBuffer[obp++]=(char)0x05;
+ *((long *)(OpBuffer+obp))=sizeof(DWORD);
+ obp+=sizeof(long);
+
+
+ //mov ecx,DestructorProcAddr
+ i2=pobj_c->DestructorMemberSubIndex;
+ if(i2==-1) return -1;
+ OpBuffer[obp++]=(char)0xB9;
+ pobj_SubAddrSchedule->add(pobj_c->ppobj_Method[i2]->psi,0);
+ pobj_c->ppobj_Method[i2]->psi->bUse=1;
+ obp+=sizeof(long);
+
+ //mov dword ptr[eax],ecx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x08;
+
+ //add eax,sizeof(DWORD)
+ OpBuffer[obp++]=(char)0x05;
+ *((long *)(OpBuffer+obp))=sizeof(DWORD);
+ obp+=sizeof(long);
+
+
+ // ※ここでプッシュされた値はNew演算子の戻り値となる
+ //push eax
+ op_push(REG_EAX);
+
+
+ /////////////////////////////////////////////////////////////////////
+
+ ////////////////////////////
+ // コンストラクタの呼び出し
+ ////////////////////////////
+
+ BOOL bSomeObjects;
+ if(ObjectSize[0]) bSomeObjects=1;
+ else bSomeObjects=0;
+ CallConstructor(pobj_c,CreateParameter,TypeSize,bSomeObjects);
+
+ return DEF_PTR_OBJECT;
+}
+
+void OpcodeDelete(char *Parameter){
+ int type;
+
+ type=NumOpe(Parameter,0,0,0);
+ if(type==-1) return;
+ if(!(type==DEF_PTR_OBJECT||type==DEF_PTR_VOID)) SetError(122,NULL,cp);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //sub eax,sizeof(DWORD)*3
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xE8;
+ OpBuffer[obp++]=(char)0x0C;
+
+ //push eax
+ op_push(REG_EAX);
+
+
+ //mov ebx,dword ptr[eax](オブジェクトの個数)
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x18;
+
+ //add eax,sizeof(DWORD)
+ OpBuffer[obp++]=(char)0x05;
+ *((long *)(OpBuffer+obp))=sizeof(DWORD);
+ obp+=sizeof(long);
+
+
+ //mov esi,dword ptr[eax](オブジェクトのサイズ)
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x30;
+
+ //add eax,sizeof(DWORD)
+ OpBuffer[obp++]=(char)0x05;
+ *((long *)(OpBuffer+obp))=sizeof(DWORD);
+ obp+=sizeof(long);
+
+
+ //mov edx,dword ptr[eax](デストラクタの関数ポインタ)
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x10;
+
+ //add eax,sizeof(DWORD)
+ OpBuffer[obp++]=(char)0x05;
+ *((long *)(OpBuffer+obp))=sizeof(DWORD);
+ obp+=sizeof(long);
+
+
+ //mov ecx,eax
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0xC8;
+
+
+ //jnzの番地
+ int jnz_back;
+ jnz_back=obp;
+
+ //push ecx
+ op_push(REG_ECX);
+
+ //push edx
+ op_push(REG_EDX);
+
+ //push ecx(Thisポインタ ※隠れた第一パラメータ)
+ op_push(REG_ECX);
+
+ //call edx
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xD2;
+
+ //pop edx
+ op_pop(REG_EDX);
+
+ //pop ecx
+ op_pop(REG_ECX);
+
+ //add ecx,esi
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xCE;
+
+ //sub ebx,1
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xEB;
+ OpBuffer[obp++]=(char)0x01;
+
+ //jnz ↑
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=jnz_back-(obp+sizeof(long));
+ obp+=sizeof(long);
+
+
+ //////////////////////////////////////////
+ // オブジェクトメンバ変数用のメモリを解放
+ //////////////////////////////////////////
+
+ //call free
+ extern SUBINFO *pSub_free;
+ op_call(pSub_free);
+}
Index: /BasicCompiler32/Compile_ProcOp.cpp
===================================================================
--- /BasicCompiler32/Compile_ProcOp.cpp (revision 3)
+++ /BasicCompiler32/Compile_ProcOp.cpp (revision 3)
@@ -0,0 +1,873 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+void SystemProc(char *name){
+ if(lstrcmp(name,"_System_GetEip")==0){
+ //mov eax,dword ptr[esp]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+
+ //ret
+ OpBuffer[obp++]=(char)0xC3;
+ }
+ else if(lstrcmp(name,"_System_InitDllGlobalVariables")==0){
+ ////////////////////////////////////////
+ // DLLのグローバル領域をコンパイル
+ ////////////////////////////////////////
+
+ extern BOOL bDll;
+ if(!bDll){
+ //ret
+ OpBuffer[obp++]=(char)0xC3;
+
+ return;
+ }
+
+ extern BOOL bCompilingGlobal;
+ BOOL bBackCompilingGlobal;
+ bBackCompilingGlobal=bCompilingGlobal;
+ bCompilingGlobal=1;
+
+ int BackCp;
+ BackCp=cp;
+ cp=-1;
+
+ extern BOOL bDebugCompile;
+ if(bDebugCompile){
+ //デバッグ用の変数を定義
+ DebugVariable();
+ }
+
+ //GC用の変数を定義
+ InitGCVariables();
+
+ GetGlobalDataForDll();
+
+ bCompilingGlobal=bBackCompilingGlobal;
+ cp=BackCp;
+
+ //ret
+ OpBuffer[obp++]=(char)0xC3;
+ }
+ else if(lstrcmp(name,"_System_InitStaticLocalVariables")==0){
+ //静的ローカルオブジェクトのコンストラクタ呼び出し
+
+ extern int MaxGlobalVarNum;
+ extern VARIABLE *GlobalVar;
+ int i;
+ for(i=0;ibUse==0||psi->bCompile) return;
+
+ psi->bCompile=1;
+
+ extern BOOL bSystemProc;
+ if(memcmp(psi->name,"_System_",8)==0) bSystemProc=1;
+ else bSystemProc=0;
+
+ extern BOOL bDebugSupportProc;
+ if(memcmp(psi->name,"_DebugSys_",10)==0){
+ if(!bDebugCompile){
+ psi->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
+ psi->VarNum=0;
+ return;
+ }
+ bDebugSupportProc=1;
+ }
+ else bDebugSupportProc=0;
+
+ psi->CompileAddress=obp;
+
+ if(psi->bSystem){
+ extern int MaxLocalVarNum;
+ extern int AllLocalVarSize;
+ MaxLocalVarNum=0;
+ AllLocalVarSize=0;
+
+ SystemProc(psi->name);
+
+ psi->EndOpAddr=obp;
+ psi->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
+ psi->VarNum=0;
+ return;
+ }
+
+ cp=psi->address;
+ for(;;cp++){
+ if(IsCommandDelimitation(basbuf[cp])) break;
+ }
+ cp--;
+
+ //ローカル変数に関する情報
+ extern VARIABLE *LocalVar;
+ extern int MaxLocalVarNum;
+ extern int AllLocalVarSize;
+ LocalVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
+ MaxLocalVarNum=0;
+ AllLocalVarSize=0;
+
+ //ローカル変数アドレススケジュール
+ extern DWORD *pLocalVarAddrSchedule;
+ extern int LocalVarAddrScheduleNum;
+ pLocalVarAddrSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
+ LocalVarAddrScheduleNum=0;
+
+ //パラメータ用の変数データを考慮
+ for(i3=psi->RealParmNum-1;i3>=0;i3--){
+ //変数データを追加
+ LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
+
+ lstrcpy(LocalVar[MaxLocalVarNum].name,psi->pRealParmInfo[i3].name);
+
+ LocalVar[MaxLocalVarNum].bArray=psi->pRealParmInfo[i3].bArray;
+ memcpy(LocalVar[MaxLocalVarNum].SubScripts,psi->pRealParmInfo[i3].SubScripts,MAX_ARRAYDIM*sizeof(int));
+
+ LocalVar[MaxLocalVarNum].type=psi->pRealParmInfo[i3].type;
+ if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT){
+ if(psi->bExport)
+ SetError(24,NULL,cp);
+ }
+
+ LocalVar[MaxLocalVarNum].u.index=psi->pRealParmInfo[i3].u.index;
+
+ if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_OBJECT){
+ //実態オブジェクトのByValパラメータ
+ LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER;
+ VarSize=PTR_SIZE;
+ }
+ else{
+ if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].bArray==0){
+ LocalVar[MaxLocalVarNum].fRef=0;
+ VarSize=GetTypeSize(LocalVar[MaxLocalVarNum].type,LocalVar[MaxLocalVarNum].u.index);
+ if(VarSize%PTR_SIZE) VarSize+=PTR_SIZE-(VarSize%PTR_SIZE);
+ }
+ else{
+ LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER;
+ VarSize=PTR_SIZE;
+ }
+ }
+ AllLocalVarSize+=VarSize;
+ LocalVar[MaxLocalVarNum].offset=AllLocalVarSize;
+
+ //レキシカルスコープ情報
+ LocalVar[MaxLocalVarNum].ScopeLevel=obj_LexScopes.GetNowLevel();
+ LocalVar[MaxLocalVarNum].ScopeStartAddress=obj_LexScopes.GetStartAddress();
+ LocalVar[MaxLocalVarNum].bLiving=TRUE;
+
+ MaxLocalVarNum++;
+ }
+
+ //Thisポインタを示すローカルオフセット値をセット
+ extern int LocalVar_ThisPtrOffset;
+ LocalVar_ThisPtrOffset=AllLocalVarSize;
+
+ BaseOffset=AllLocalVarSize;
+
+ //ret用のアドレスを考慮
+ AllLocalVarSize+=sizeof(long);
+
+ //コンパイル中の関数が属するクラス
+ pobj_CompilingClass=psi->pobj_ParentClass;
+
+ //コンパイル中の関数
+ extern SUBINFO *pCompilingSubInfo;
+ pCompilingSubInfo=psi;
+
+
+ ///////////////////////
+ // ここからコード生成
+
+ //sub esp,AllLocalVarSize(スケジュール)
+ op_sub_esp(0xFFFFFFFF);
+ LocalVarSchedule=obp-sizeof(long);
+
+ //push ebp
+ op_push(REG_EBP);
+
+ //mov ebp,esp
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0xEC;
+
+ //push ebx
+ op_push(REG_EBX);
+
+ //push esi
+ OpBuffer[obp++]=(char)0x56;
+
+ //push edi
+ OpBuffer[obp++]=(char)0x57;
+
+ if(psi->ReturnType!=-1){
+ //戻り値が存在するとき
+
+ char *temp;
+ if(psi->name[0]==1&&psi->name[1]==ESC_OPERATOR) temp="_System_ReturnValue";
+ else temp=psi->name;
+
+ if(psi->ReturnType==DEF_OBJECT){
+ //戻り値用オブジェクトのコンストラクタを呼び出す
+ if(psi->u.Return_pobj_c->ConstructorMemberSubIndex!=-1){
+ sprintf(temporary,"%s.%s()",temp,psi->u.Return_pobj_c->name);
+ OpcodeOthers(temporary);
+ }
+ }
+ else{
+ //戻り値用の変数の定義
+ sprintf(temporary,"%s%c%c",temp,1,ESC_AS);
+ GetTypeName(psi->ReturnType,psi->u.ReturnIndex,temporary+lstrlen(temporary));
+ OpcodeDim(temporary,0);
+ }
+ }
+
+ //プロシージャ抜け出しスケジュール(Exit Sub/Function)
+ extern DWORD *pExitSubSchedule;
+ extern int ExitSubScheduleNum;
+ pExitSubSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
+ ExitSubScheduleNum=0;
+
+ //ラベル用のメモリを確保
+ extern LABEL *pLabelNames;
+ extern int MaxLabelNum;
+ pLabelNames=(LABEL *)HeapAlloc(hHeap,0,1);
+ MaxLabelNum=0;
+
+ //Gotoラベルスケジュール
+ extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
+ extern int GotoLabelScheduleNum;
+ pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapAlloc(hHeap,0,1);
+ GotoLabelScheduleNum=0;
+
+ //With情報のメモリを確保
+ extern WITHINFO WithInfo;
+ WithInfo.ppName=(char **)HeapAlloc(hHeap,0,1);
+ WithInfo.pWithCp=(int *)HeapAlloc(hHeap,0,1);
+ WithInfo.num=0;
+
+ //重複エラー情報管理のメモリを確保
+ extern char **SynonymErrorWords;
+ extern int SynonymErrorNum;
+ SynonymErrorNum=0;
+ SynonymErrorWords=(char **)HeapAlloc(hHeap,0,1);
+
+ //Continueアドレスを初期化
+ extern DWORD dwContinueAddress;
+ dwContinueAddress=-1;
+
+ if(bDebugCompile&&bDebugSupportProc==0){
+ //push dword ptr[ebp+(AllLocalVarSize-BaseOffset)](スケジュール)
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xB5;
+ EspOffsetSchedule=obp;
+ obp+=sizeof(long);
+
+ //push dword ptr[ebp](以前のebp)
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x75;
+ OpBuffer[obp++]=(char)0x00;
+
+ //call _DebugSys_StartProc
+ extern SUBINFO *pSub_DebugSys_StartProc;
+ op_call(pSub_DebugSys_StartProc);
+ }
+
+ if(pobj_CompilingClass){
+ if(lstrcmp(psi->name,pobj_CompilingClass->name)==0){
+ ////////////////////////////////////
+ // コンストラクタをコンパイルするとき
+ ////////////////////////////////////
+
+ //スーパークラスかどうかの識別
+ //(継承元がインターフェイスの場合もスーパークラスと見なす)
+ BOOL bThisIsSuperClass;
+ if(pobj_CompilingClass->pobj_InheritsClass==0) bThisIsSuperClass=1;
+ else if(pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex==-1){
+ //インターフェイスを継承したときはコンストラクタを持たない
+ bThisIsSuperClass=1;
+ }
+ else bThisIsSuperClass=0;
+
+ if(!bThisIsSuperClass){
+ /* サブクラスコンストラクタをコンパイルしているときは、
+ スーパークラスのコンストラクタを呼び出す */
+
+ i3=cp+1;
+ while(IsCommandDelimitation(basbuf[i3])) i3++;
+ for(i4=0;;i3++,i4++){
+ if(!IsVariableChar(basbuf[i3])){
+ temporary[i4]=0;
+ break;
+ }
+ temporary[i4]=basbuf[i3];
+ }
+ if(lstrcmp(temporary,
+ pobj_CompilingClass->pobj_InheritsClass->name)==0){
+ //スーパークラスのコンストラクタを呼び出す
+ cp=i3;
+ for(i4=0;;cp++,i4++){
+ if(IsCommandDelimitation(basbuf[cp])){
+ temporary[i4]=0;
+ break;
+ }
+ temporary[i4]=basbuf[cp];
+ }
+ if(!(temporary[0]=='('&&temporary[lstrlen(temporary)-1]==')')){
+ SetError(1,NULL,cp);
+ }
+ RemoveStringPare(temporary);
+
+ i3=pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex;
+ Opcode_CallProc(temporary,
+ pobj_CompilingClass->ppobj_Method[i3]->psi,
+ 0,
+ 0,
+ "",
+ 0);
+ }
+ else{
+ //スーパークラスのコンストラクタを暗黙的に呼び出す
+ i3=pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex;
+ Opcode_CallProc("",
+ pobj_CompilingClass->ppobj_Method[i3]->psi,
+ 0,
+ 0,
+ "",
+ 0);
+ }
+ }
+
+
+ //実体クラスを持つメンバのコンストラクタ(引数有りを除く)を呼び出す
+ int offset;
+ int MemberTypeSize;
+ int MemberObjectNum;
+ if(pobj_CompilingClass->vtbl_num) offset=PTR_SIZE;
+ else offset=0;
+ for(i3=0;i3iMemberNum;i3++){
+ offset=GetSizeOfClassMember(pobj_CompilingClass,pobj_CompilingClass->ppobj_Member[i3]->name,NULL);
+
+ if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type==DEF_OBJECT){
+ if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex!=-1){
+ i5=pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex;
+ if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi->RealParmNum==1){ //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる
+
+ MemberTypeSize=
+ GetTypeSize(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type,
+ pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.lpIndex);
+
+ MemberObjectNum=
+ JumpSubScripts(pobj_CompilingClass->ppobj_Member[i3]->SubScripts);
+
+ for(i4=0;i4ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
+ }
+ }
+ }
+ }
+ }
+
+
+ //仮想関数テーブルを初期化
+ if(pobj_CompilingClass->vtbl_num&&
+ pobj_CompilingClass->IsHoldAbstractFunction()==0){
+ //関数テーブルに値をセット
+ offset=pobj_CompilingClass->GetVtblGlobalOffset();
+
+ //mov eax,offset
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+
+ //Thisポインタをecxにコピー
+ SetThisPtrToReg(REG_ECX);
+
+ //mov dword ptr[ecx],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x01;
+ }
+ }
+ }
+
+ //////////////////////////////////////////
+ //////////////////////////////////////////
+ ////// プロシージャ内をコンパイル ////////
+ if(psi->dwType==SUBTYPE_SUB) CompileBuffer(ESC_ENDSUB,0);
+ else if(psi->dwType==SUBTYPE_FUNCTION) CompileBuffer(ESC_ENDFUNCTION,0);
+ else if(psi->dwType==SUBTYPE_MACRO) CompileBuffer(ESC_ENDMACRO,0);
+ //////////////////////////////////////////
+ //////////////////////////////////////////
+
+ if(pobj_CompilingClass){
+ if(psi->name[0]=='~'){
+ ////////////////////////////////////
+ //デストラクタをコンパイルしたとき
+ ////////////////////////////////////
+
+ if(pobj_CompilingClass->pobj_InheritsClass){
+ /* サブクラスのデストラクタをコンパイルしているときは、
+ スーパークラスのデストラクタを呼び出す */
+
+ i3=pobj_CompilingClass->pobj_InheritsClass->DestructorMemberSubIndex;
+ if(i3!=-1){
+ Opcode_CallProc("",
+ pobj_CompilingClass->ppobj_Method[i3]->psi,
+ 0,
+ 0,
+ "",
+ 0);
+ }
+ }
+
+ //実体クラスを持つメンバのデストラクタを呼び出す
+ //※コンストラクタと逆順序で呼び出す
+ int offset;
+ int MemberTypeSize;
+ int MemberObjectNum;
+ offset=GetTypeSize(DEF_OBJECT,(LONG_PTR)pobj_CompilingClass);
+ for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){
+ MemberTypeSize=
+ GetTypeSize(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type,
+ pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.lpIndex);
+
+ MemberObjectNum=
+ JumpSubScripts(pobj_CompilingClass->ppobj_Member[i3]->SubScripts);
+
+ offset-=MemberTypeSize*MemberObjectNum;
+
+ if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type==DEF_OBJECT){
+ if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->DestructorMemberSubIndex!=-1){
+ for(i4=MemberObjectNum-1;i4>=0;i4--){
+ //Thisポインタをecxにコピー
+ SetThisPtrToReg(REG_ECX);
+
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=offset+i4*MemberTypeSize;
+ obp+=sizeof(long);
+
+ //push ecx
+ op_push(REG_ECX);
+
+ //call destructor
+ i5=pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->DestructorMemberSubIndex;
+ op_call(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //プロシージャ抜け出しスケジュール(Exit Sub/Function)
+ for(i3=0;i3ReturnType!=-1){
+ //戻り値をeax、edxに設定
+ RELATIVE_VAR RelativeVar;
+ LONG_PTR lpIndex;
+
+ char *temp;
+ if(psi->name[0]==1&&psi->name[1]==ESC_OPERATOR)
+ temp="_System_ReturnValue";
+ else temp=psi->name;
+ GetVarOffset(1,temp,&i3,&RelativeVar,&lpIndex);
+
+ i3=psi->ReturnType;
+
+ if(i3==DEF_OBJECT){
+ SetVarPtrToEax(&RelativeVar);
+ }
+ else if(i3==DEF_DOUBLE){
+ //fld qword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0xDD;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=RelativeVar.offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else if(i3==DEF_SINGLE){
+ //fld dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=RelativeVar.offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else if(i3==DEF_INT64||i3==DEF_QWORD){
+ //mov eax,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=RelativeVar.offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //mov edx,dword ptr[ebp+offset+sizeof(long)]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x95;
+ *((long *)(OpBuffer+obp))=RelativeVar.offset+sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else if(i3==DEF_LONG||i3==DEF_DWORD||
+ IsPtrType(i3)){
+ //mov eax,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=RelativeVar.offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else if(i3==DEF_INTEGER||i3==DEF_WORD){
+ //xor eax,eax(eaxを0に初期化する)
+ op_zero_reg(REG_EAX);
+
+ //mov ax,word ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=RelativeVar.offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else if(i3==DEF_CHAR||i3==DEF_BYTE){
+ //xor eax,eax(eaxを0に初期化する)
+ op_zero_reg(REG_EAX);
+
+ //mov al,byte ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8A;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=RelativeVar.offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+
+ //ローカル変数アドレススケジュール
+ for(i3=0;i3bCdecl){
+ //ret 0
+ OpBuffer[obp++]=(char)0xC3;
+ }
+ else{
+ //ret BaseOffset(パラメータ分のスタック領域を解放)
+ OpBuffer[obp++]=(char)0xC2;
+ *((_int16 *)(OpBuffer+obp))=(_int16)BaseOffset;
+ obp+=sizeof(_int16);
+ }
+
+ psi->EndOpAddr=obp;
+ psi->pVar=LocalVar;
+ psi->VarNum=MaxLocalVarNum;
+
+ //ローカル変数のネーム情報は後に解放する
+}
+void CompileLocal(){
+ extern SUBINFO **ppSubHash;
+ int i2;
+ SUBINFO *psi;
+
+ extern BOOL bDll;
+ if(bDll){
+ //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする
+ psi=GetSubHash("_System_InitDllGlobalVariables");
+ if(psi){
+ CompileBufferInProcedure(psi);
+ }
+ else SetError(300,NULL,cp);
+ }
+
+ //_System_InitStaticLocalVariablesは一番最後にコンパイル
+ //※一般関数内の静的変数オブジェクトをすべて収集しなければならない
+ extern SUBINFO *pSub_System_InitStaticLocalVariables;
+ pSub_System_InitStaticLocalVariables->bCompile=1;
+
+ //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
+ extern SUBINFO *pSub_System_Call_Destructor_of_GlobalObject;
+ pSub_System_Call_Destructor_of_GlobalObject->bCompile=1;
+
+Repeat:
+ for(i2=0;i2pNextData;
+ }
+ }
+
+ //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
+ for(i2=0;i2bUse&&psi->bCompile==0){
+ goto Repeat;
+ }
+
+ psi=psi->pNextData;
+ }
+ }
+
+ //_System_InitStaticLocalVariablesは一番最後にコンパイル
+ pSub_System_InitStaticLocalVariables->bCompile=0;
+ CompileBufferInProcedure(pSub_System_InitStaticLocalVariables);
+
+ //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
+ pSub_System_Call_Destructor_of_GlobalObject->bCompile=0;
+ CompileBufferInProcedure(pSub_System_Call_Destructor_of_GlobalObject);
+}
Index: /BasicCompiler32/Compile_Set_Var.cpp
===================================================================
--- /BasicCompiler32/Compile_Set_Var.cpp (revision 3)
+++ /BasicCompiler32/Compile_Set_Var.cpp (revision 3)
@@ -0,0 +1,867 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+BOOL IsUse_ecx(RELATIVE_VAR *pRelativeVar){
+ if(pRelativeVar->bOffsetOffset||pRelativeVar->dwKind==VAR_DIRECTMEM) return 1;
+ return 0;
+}
+
+void SetObjectVariable(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap){
+ ///////////////////////////////////////////////////////////////////
+ // オペレータ '=' のオーバーロード関数を呼ぶ
+ ///////////////////////////////////////////////////////////////////
+
+ int type[10];
+ LONG_PTR index_stack[10];
+ BOOL array_bUseHeap[10];
+ int sp=2;
+
+ //左辺
+ type[0]=DEF_OBJECT;
+ index_stack[0]=lpVarIndex;
+ array_bUseHeap[0]=0;
+
+ //右辺
+ type[1]=CalcType;
+ index_stack[1]=lpCalcIndex;
+ array_bUseHeap[1]=bUseHeap;
+
+ int iRet;
+ iRet=CallOperatorProc(CALC_SUBSITUATION,NULL,type,index_stack,array_bUseHeap,sp);
+ if(iRet==-1||iRet==1){
+ //成功したとき、またはエラーが発行されたとき
+ return;
+ }
+
+ if(CalcType==DEF_OBJECT&&lpVarIndex==lpCalcIndex){
+ //双方のオブジェクト型が完全に一致したとき
+ //※コピーを行う
+
+ int object_size;
+ object_size=GetSizeOfClass((CClass *)lpVarIndex);
+
+ //mov ecx,object_size
+ op_mov_RV(REG_ECX,object_size);
+
+ //pop esi
+ op_pop(REG_ESI);
+
+ //pop edi
+ op_pop(REG_EDI);
+
+ if(bUseHeap){
+ //mov eax,esi
+ op_mov_RR(REG_EAX,REG_ESI);
+ }
+
+ //rep movs byte ptr[edi],byte ptr[esi]
+ op_rep_movs(sizeof(BYTE));
+
+ if(bUseHeap){
+ //push eax
+ op_push(REG_EAX);
+
+ //call free
+ extern SUBINFO *pSub_free;
+ op_call(pSub_free);
+ }
+
+ return;
+ }
+ else{
+ SetError(1,NULL,cp);
+ }
+}
+
+void SetDoubleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
+ ChangeTypeToDouble(type);
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ if(VarKind==VAR_GLOBAL){
+ if(bOffsetOffset){
+ //mov dword ptr[ecx+offset],ebx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x99;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+
+ //mov dword ptr[ecx+offset+sizeof(long)],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x81;
+ *((long *)(OpBuffer+obp))=offset+sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov dword ptr[offset],ebx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x1D;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+
+ //mov dword ptr[offset+sizeof(long)],eax
+ OpBuffer[obp++]=(char)0xA3;
+ *((long *)(OpBuffer+obp))=offset+sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(VarKind==VAR_LOCAL){
+ if(bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //mov dword ptr[ebp+ecx],ebx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x5C;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+
+ //add ecx,sizeof(long)
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xC1;
+ OpBuffer[obp++]=(char)0x04;
+
+ //mov dword ptr[ebp+ecx],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //mov dword ptr[ebp+offset],ebx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x9D;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //mov dword ptr[ebp+offset+sizeof(long)],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset+sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(VarKind==VAR_REFLOCAL){
+ if(bOffsetOffset){
+ //add ecx,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0x8D;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ecx,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x8D;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ //mov dword ptr[ecx],ebx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x19;
+
+ //mov dword ptr[ecx+sizeof(long)],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)0x04;
+ }
+ else if(VarKind==VAR_DIRECTMEM){
+ //mov dword ptr[ecx],ebx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x19;
+
+ //mov dword ptr[ecx+sizeof(long)],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)0x04;
+ }
+}
+void SetSingleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
+ if(type==DEF_SINGLE){
+ //32ビット変数としてそのままコピーする
+ SetDWordVariable(DEF_DWORD,VarKind,offset,bOffsetOffset);
+ return;
+ }
+
+ if(type==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else if(type==DEF_INT64||type==DEF_QWORD){
+ //64ビット整数
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else if(IsSignedType(type)){
+ //符号あり整数
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else{
+ if(!IsWholeNumberType(type)){
+ //不正な型の場合
+ SetError(9,NULL,cp);
+ return;
+ }
+
+ //符号なし整数
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //push 0
+ op_push_value(0);
+
+ //push eax
+ op_push(REG_EAX);
+
+ //fild qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x2C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //add esp,8
+ op_add_esp(8);
+ }
+
+ if(VarKind==VAR_GLOBAL){
+ if(bOffsetOffset){
+ //fstp dword ptr[ecx+offset]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x99;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //fstp dword ptr[offset]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x1D;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(VarKind==VAR_LOCAL){
+ if(bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //fstp dword ptr[ebp+ecx]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x5C;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //fstp dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x9D;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(VarKind==VAR_REFLOCAL){
+ //mov eax,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ if(bOffsetOffset){
+ //add eax,ecx
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xC1;
+ }
+
+ //fstp dword ptr[eax]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x18;
+ }
+ else if(VarKind==VAR_DIRECTMEM){
+ //fstp dword ptr[ecx]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x19;
+ }
+}
+void SetInt64Variable(int type,RELATIVE_VAR *pRelative){
+ if(type==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //fistp qword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop edx
+ op_pop(REG_EDX);
+ }
+ else if(type==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //fistp qword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop edx
+ op_pop(REG_EDX);
+ }
+ else if(type==DEF_INT64||type==DEF_QWORD){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop edx
+ op_pop(REG_EDX);
+ }
+ else if(IsSignedType(type)){
+ //符号拡張
+ //edx:eax ← eax
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //cdq
+ op_cdq();
+ }
+ else{
+ if(!IsWholeNumberType(type)){
+ //不正な型の場合
+ SetError(9,NULL,cp);
+ return;
+ }
+
+ //符号拡張
+ //edx=0:eax
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //xor edx,edx
+ op_zero_reg(REG_EDX);
+ }
+
+ if(pRelative->dwKind==VAR_GLOBAL){
+ if(pRelative->bOffsetOffset){
+ //mov dword ptr[ecx+offset],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x81;
+ *((long *)(OpBuffer+obp))=pRelative->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+
+ //mov dword ptr[ecx+offset+sizeof(long)],edx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x91;
+ *((long *)(OpBuffer+obp))=pRelative->offset+sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov dword ptr[offset],eax
+ OpBuffer[obp++]=(char)0xA3;
+ *((long *)(OpBuffer+obp))=pRelative->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+
+ //mov dword ptr[offset+sizeof(long)],edx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x15;
+ *((long *)(OpBuffer+obp))=pRelative->offset+sizeof(DWORD);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelative->dwKind==VAR_LOCAL){
+ if(pRelative->bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=pRelative->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //mov dword ptr[ebp+ecx],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+
+ //add ecx,sizeof(long)
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xC1;
+ OpBuffer[obp++]=(char)0x04;
+
+ //mov dword ptr[ebp+ecx],edx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x54;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //mov dword ptr[ebp+offset],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=pRelative->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //mov dword ptr[ebp+offset+sizeof(long)],edx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x95;
+ *((long *)(OpBuffer+obp))=pRelative->offset+sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelative->dwKind==VAR_REFLOCAL){
+ if(pRelative->bOffsetOffset){
+ //add ecx,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0x8D;
+ *((long *)(OpBuffer+obp))=pRelative->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ecx,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x8D;
+ *((long *)(OpBuffer+obp))=pRelative->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ //mov dword ptr[ecx],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x01;
+
+ //mov dword ptr[ecx+sizeof(long)],edx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x51;
+ OpBuffer[obp++]=(char)0x04;
+ }
+ else if(pRelative->dwKind==VAR_DIRECTMEM){
+ //mov dword ptr[ecx],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x01;
+
+ //mov dword ptr[ecx+sizeof(long)],edx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x51;
+ OpBuffer[obp++]=(char)0x04;
+ }
+}
+void SetDWordVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
+ if(type==DEF_DOUBLE||type==DEF_SINGLE){
+ if(type==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+ }
+ else if(type==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //sub esp,4
+ op_sub_esp(4);
+ }
+
+ //fistp qword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(type==DEF_INT64||type==DEF_QWORD){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else{
+ if(!IsWholeNumberType(type)){
+ //不正な型の場合
+ SetError(9,NULL,cp);
+ return;
+ }
+
+ ChangeTypeToWhole(type,DEF_LONG);
+
+ //pop eax
+ op_pop(REG_EAX);
+ }
+
+ if(VarKind==VAR_GLOBAL){
+ if(bOffsetOffset){
+ //mov dword ptr[ecx+offset],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x81;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov dword ptr[offset],eax
+ OpBuffer[obp++]=(char)0xA3;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(VarKind==VAR_LOCAL){
+ if(bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //mov dword ptr[ebp+ecx],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //mov dword ptr[ebp+offset],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(VarKind==VAR_REFLOCAL){
+ if(bOffsetOffset){
+ //add ecx,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0x8D;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ecx,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x8D;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ //mov dword ptr[ecx],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x01;
+ }
+ else if(VarKind==VAR_DIRECTMEM){
+ //mov dword ptr[ecx],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x01;
+ }
+}
+void SetLongVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
+ if(type==DEF_DOUBLE||type==DEF_SINGLE){
+ if(type==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else if(type==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+
+ if(VarKind==VAR_GLOBAL){
+ if(bOffsetOffset){
+ //fistp dword ptr[ecx+offset]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x99;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ fpu_cast_end();
+ }
+ else{
+ //fistp dword ptr[offset]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1D;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ fpu_cast_end();
+ }
+ }
+ else if(VarKind==VAR_LOCAL){
+ if(bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //fistp dword ptr[ebp+ecx]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x5C;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ fpu_cast_end();
+ }
+ else{
+ //fistp dword ptr[ebp+offset]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x9D;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ fpu_cast_end();
+ }
+ }
+ else if(VarKind==VAR_REFLOCAL){
+ //mov eax,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ if(bOffsetOffset){
+ //add eax,ecx
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xC1;
+ }
+
+ //fistp dword ptr[eax]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x18;
+ fpu_cast_end();
+ }
+ else if(VarKind==VAR_DIRECTMEM){
+ //fistp dword ptr[ecx]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x19;
+ fpu_cast_end();
+ }
+ }
+ else{
+ //実数以外の型からの代入処理はDWordのものと同様
+ SetDWordVariable(type,VarKind,offset,bOffsetOffset);
+ }
+}
+void Set16Variable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
+ ChangeTypeToWhole(type,DEF_INTEGER);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ if(VarKind==VAR_GLOBAL){
+ if(bOffsetOffset){
+ //mov word ptr[ecx+offset],ax
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x81;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov word ptr[offset],ax
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0xA3;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(VarKind==VAR_LOCAL){
+ if(bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //mov word ptr[ebp+ecx],ax
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //mov word ptr[ebp+offset],ax
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(VarKind==VAR_REFLOCAL){
+ //mov ebx,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x9D;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ if(bOffsetOffset){
+ //add ebx,ecx
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xD9;
+ }
+
+ //mov word ptr[ebx],ax
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x03;
+ }
+ else if(VarKind==VAR_DIRECTMEM){
+ //mov word ptr[ecx],ax
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x01;
+ }
+}
+void Set8Variable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
+ ChangeTypeToWhole(type,DEF_CHAR);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ if(VarKind==VAR_GLOBAL){
+ if(bOffsetOffset){
+ //mov byte ptr[ecx+offset],al
+ OpBuffer[obp++]=(char)0x88;
+ OpBuffer[obp++]=(char)0x81;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov byte ptr[offset],al
+ OpBuffer[obp++]=(char)0xA2;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(VarKind==VAR_LOCAL){
+ if(bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //mov byte ptr[ebp+ecx],al
+ OpBuffer[obp++]=(char)0x88;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //mov byte ptr[ebp+offset],al
+ OpBuffer[obp++]=(char)0x88;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(VarKind==VAR_REFLOCAL){
+ //mov ebx,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x9D;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ if(bOffsetOffset){
+ //add ebx,ecx
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xD9;
+ }
+
+ //mov byte ptr[ebx],al
+ OpBuffer[obp++]=(char)0x88;
+ OpBuffer[obp++]=(char)0x03;
+ }
+ else if(VarKind==VAR_DIRECTMEM){
+ //mov byte ptr[ecx],al
+ OpBuffer[obp++]=(char)0x88;
+ OpBuffer[obp++]=(char)0x01;
+ }
+}
Index: /BasicCompiler32/Compile_Statement.cpp
===================================================================
--- /BasicCompiler32/Compile_Statement.cpp (revision 3)
+++ /BasicCompiler32/Compile_Statement.cpp (revision 3)
@@ -0,0 +1,2028 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void OpcodeOthers(char *Command){
+ int i,i2;
+ char buffer[8192];
+ SUBINFO *psi;
+
+ for(i=0;;i++){
+ if(Command[i]=='['){
+ i2=GetStringInBracket(buffer+i,Command+i);
+ i+=i2-1;
+ continue;
+ }
+ if(Command[i]==1&&Command[i+1]==ESC_PSMEM){
+ buffer[i]=Command[i];
+ i++;
+ buffer[i]=Command[i];
+ continue;
+ }
+ if(!IsVariableChar(Command[i])){
+ buffer[i]=0;
+ break;
+ }
+ buffer[i]=Command[i];
+ }
+
+ if(!(
+ IsVariableTopChar(buffer[0])||
+ buffer[0]=='.'||
+ (buffer[0]==1&&buffer[1]==ESC_PSMEM)
+ )){
+ SetError(1,NULL,cp);
+ return;
+ }
+
+
+ if(Command[i]=='\0'){
+ //////////////////////////////
+ // パラメータ無しのマクロ検索
+ //////////////////////////////
+
+ psi=GetSubHash(Command);
+
+ //GetSubHash内でエラー提示が行われた場合
+ if(psi==(SUBINFO *)-1) return;
+
+ if(psi==0){
+ char temporary[VN_SIZE];
+ lstrcpy(temporary,Command);
+
+ CharUpper(temporary);
+ psi=GetSubHash(temporary);
+
+ //GetSubHash内でエラー提示が行われた場合
+ if(psi==(SUBINFO *)-1) return;
+ }
+
+ if(psi){
+ if(psi->dwType!=SUBTYPE_MACRO) SetError(10,Command,cp);
+
+ Opcode_CallProc("",psi,0,0,"",0);
+
+ return;
+ }
+ }
+ else if(IsNumCalcMark(Command,i)){
+ //代入演算
+ OpcodeCalc(Command);
+ return;
+ }
+
+
+ int idProc;
+ void *pInfo;
+ idProc=GetProc(buffer,&pInfo);
+
+ int i4;
+ char temp2[VN_SIZE];
+ if(idProc){
+ if(Command[i]!='('){
+ SetError(10,buffer,cp);
+ return;
+ }
+ i4=GetStringInPare_RemovePare(temp2,Command+i+1);
+
+ //閉じカッコ")"に続く文字がNULLでないときはエラーにする
+ if(Command[i+1+i4+1]!='\0') SetError(42,NULL,cp);
+
+ ////////////////
+ // 呼び出し
+ ////////////////
+
+ LONG_PTR lp;
+ i2=CallProc(idProc,pInfo,buffer,temp2,&lp);
+
+
+ /////////////////////
+ // 戻り値の処理
+ /////////////////////
+
+ if(i2==DEF_DOUBLE||i2==DEF_SINGLE){
+ //fstp st(0)
+ OpBuffer[obp++]=(char)0xDD;
+ OpBuffer[obp++]=(char)0xD8;
+ }
+ if(i2==DEF_OBJECT){
+ CClass *pobj_Class;
+ pobj_Class=(CClass *)lp;
+ if(pobj_Class->DestructorMemberSubIndex!=-1){
+ //デストラクタの呼び出し
+
+ //push eax
+ op_push(REG_EAX);
+
+ //push eax
+ op_push(REG_EAX);
+
+ //call destructor
+ int i5;
+ i5=pobj_Class->DestructorMemberSubIndex;
+ op_call(pobj_Class->ppobj_Method[i5]->psi);
+ }
+ else{
+ //push eax
+ op_push(REG_EAX);
+ }
+
+ //call free
+ extern SUBINFO *pSub_free;
+ op_call(pSub_free);
+ }
+ return;
+ }
+
+
+ //////////////////////////
+ // その他は代入演算を行う
+ //////////////////////////
+ OpcodeCalc(Command);
+}
+
+void OpcodeIf(char *Parameter){
+ int i,i2,i3,i4,type;
+
+ for(i=0;;i++){
+ if(Parameter[i]=='\0'){
+ SetError(21,NULL,cp);
+ return;
+ }
+ if(Parameter[i]==1&&Parameter[i+1]==ESC_THEN){
+ Parameter[i]=0;
+ break;
+ }
+ }
+
+ type=NumOpe(Parameter,0,0,0);
+
+ if(type==-1){
+ //NumOpe内でエラー
+ i3=-1; //ダミー
+ }
+ else if(type==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //push 0
+ op_push_value(0);
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+
+ //add esp,sizeof(double)+sizeof(long)
+ op_add_esp(sizeof(double)+sizeof(long));
+
+ //fcompp
+ OpBuffer[obp++]=(char)0xDE;
+ OpBuffer[obp++]=(char)0xD9;
+
+ //fnstsw ax
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0xE0;
+
+ //test ah,40
+ OpBuffer[obp++]=(char)0xF6;
+ OpBuffer[obp++]=(char)0xC4;
+ OpBuffer[obp++]=(char)0x40;
+
+ //jne (endif、または else まで)
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x85;
+ obp+=sizeof(long);
+
+ //jneの番地
+ i3=obp;
+ }
+ else if(type==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //push 0
+ op_push_value(0);
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+
+ //add esp,sizeof(float)+sizeof(long)
+ op_add_esp(sizeof(float)+sizeof(long));
+
+ //fcompp
+ OpBuffer[obp++]=(char)0xDE;
+ OpBuffer[obp++]=(char)0xD9;
+
+ //fnstsw ax
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0xE0;
+
+ //test ah,40
+ OpBuffer[obp++]=(char)0xF6;
+ OpBuffer[obp++]=(char)0xC4;
+ OpBuffer[obp++]=(char)0x40;
+
+ //jne (endif、または else まで)
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x85;
+ obp+=sizeof(long);
+
+ //jneの番地
+ i3=obp;
+ }
+ else if(type==DEF_INT64||type==DEF_QWORD){
+ //64ビット型
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //cmp eax,0
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xF8;
+ OpBuffer[obp++]=(char)0x00;
+
+ //jne
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x85;
+ obp+=sizeof(long);
+ i3=obp;
+
+
+ //cmp ebx,0
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xFB;
+ OpBuffer[obp++]=(char)0x00;
+
+ //jne
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x85;
+ obp+=sizeof(long);
+ i4=obp;
+
+
+
+ //jmp (endif、または else までジャンプ)
+ OpBuffer[obp++]=(char)0xE9;
+ obp+=sizeof(long);
+
+ *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;
+ *((long *)(OpBuffer+i4-sizeof(long)))=obp-i4;
+
+ //jmpの番地
+ i3=obp;
+ }
+ else{
+ //32ビット型
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //cmp eax,0
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xF8;
+ OpBuffer[obp++]=(char)0x00;
+
+ //je (endif、または else まで条件ジャンプ)
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x84;
+ obp+=sizeof(long);
+
+ //jeの番地
+ i3=obp;
+ }
+
+
+ /////////////////////////
+ // If内をコード化
+ /////////////////////////
+
+ //レキシカルスコープをレベルアップ
+ obj_LexScopes.LevelUp(obp);
+
+ i2=CompileBuffer(ESC_ENDIF,0);
+
+ //レキシカルスコープをレベルダウン
+ obj_LexScopes.LevelDown();
+
+
+ if(i3==-1) return;
+
+ extern char *basbuf;
+ if(i2==ESC_ELSE){
+ //jmp (endifまで)
+ OpBuffer[obp++]=(char)0xE9;
+ obp+=sizeof(long);
+
+ *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3; //ifからelseへのジャンプ先のオフセット値
+
+ i3=obp;
+
+
+ /////////////////////////
+ // Else内をコード化
+ /////////////////////////
+
+ //レキシカルスコープをレベルアップ
+ obj_LexScopes.LevelUp(obp);
+
+ CompileBuffer(ESC_ENDIF,0);
+
+ //レキシカルスコープをレベルダウン
+ obj_LexScopes.LevelDown();
+
+
+ *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3; //jmpジャンプ先のオフセット値
+ }
+ else{
+ *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3; //jeジャンプ先のオフセット値
+ }
+}
+
+int GetLabelAddress(char *LabelName,int LineNum){
+ extern int MaxLabelNum;
+ extern LABEL *pLabelNames;
+ int i;
+
+ if(LabelName){
+ for(i=0;i=0",StepNum);
+ NumOpe(temporary,0,0,0);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //cmp eax,0
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xF8;
+ OpBuffer[obp++]=(char)0x00;
+
+ //je [カウンタ減少の場合の判定]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x84;
+ i2=obp;
+ obp+=sizeof(long);
+
+ //判定(カウンタ増加の場合)
+ sprintf(temporary,"%s<=(%s)",variable,JudgeNum);
+ NumOpe(temporary,0,0,0);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //jmp [カウンタ減少の場合の判定を飛び越す]
+ OpBuffer[obp++]=(char)0xE9;
+ i3=obp;
+ obp+=sizeof(long);
+
+ *((long *)(OpBuffer+i2))=obp-(i2+sizeof(long)); //jeジャンプ先のオフセット値
+
+ //判定(カウンタ減少の場合)
+ sprintf(temporary,"%s>=(%s)",variable,JudgeNum);
+ NumOpe(temporary,0,0,0);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ *((long *)(OpBuffer+i3))=obp-(i3+sizeof(long)); //jmpジャンプ先のオフセット値
+
+ //cmp eax,0
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xF8;
+ OpBuffer[obp++]=(char)0x00;
+
+ErrorStep:
+
+ //je ...
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x84;
+ int je_schedule=obp;
+ obp+=sizeof(long);
+
+ //ExitForスケジュールの準備
+ lpdwTemp=pExitForSchedule;
+ TempNum=ExitForScheduleNum;
+ pExitForSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
+ ExitForScheduleNum=0;
+
+ //レキシカルスコープをレベルアップ
+ obj_LexScopes.LevelUp(obp);
+
+ //For内をコンパイル
+ CompileBuffer(0,COM_NEXT);
+
+ CallDestrouctorsOfScope();
+
+ if(szNextVariable[0]){
+ if(lstrcmp(szNextVariable,variable)!=0){
+ SetError(55,szNextVariable,cp);
+ }
+ }
+
+ //jmp ...
+ OpBuffer[obp++]=(char)0xE9;
+ *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
+ obp+=sizeof(long);
+
+ //ExitForスケジュール
+ for(i=0;iGetOperatorSubInfo(CALC_EQUAL,num);
+ if(num==0){
+ HeapDefaultFree(ppsi);
+
+ return;
+ }
+
+ PARAMETER_INFO *ppi;
+ int iParmNum=0;
+
+ //_System_LocalThis
+ ppi=(PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
+ ppi[iParmNum].bArray=0;
+ ppi[iParmNum].bByVal=0;
+ ppi[iParmNum].name=0;
+ ppi[iParmNum].type=DEF_PTR_VOID;
+ ppi[iParmNum].u.index=-1;
+ ppi[iParmNum].SubScripts[0]=-1;
+ iParmNum++;
+
+ ppi[iParmNum].bArray=0;
+ ppi[iParmNum].bByVal=0;
+ ppi[iParmNum].name=0;
+ ppi[iParmNum].type=type2;
+ ppi[iParmNum].u.index=lpIndex2;
+ ppi[iParmNum].SubScripts[0]=-1;
+ iParmNum++;
+
+ //オーバーロードを解決
+ SUBINFO *psi;
+ psi=OverloadSolution("==",ppsi,num,ppi,iParmNum,NULL);
+ HeapDefaultFree(ppsi);
+ HeapDefaultFree(ppi);
+
+ if(!psi){
+ //エラー
+ return;
+ }
+
+
+ //pop edx
+ op_pop(REG_EDX);
+
+ //mov ecx,dword ptr[esp]
+ op_mov_RM(sizeof(long),REG_ECX,REG_ESP,0,MOD_BASE);
+
+ //push edx
+ op_push(REG_EDX);
+
+ //push ecx
+ op_push(REG_ECX);
+
+ //call operator_proc ※ ==演算子
+ op_call(psi);
+
+ //test eax,eax
+ op_test(REG_EAX,REG_EAX);
+
+ //jne ...
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x85;
+ AddCaseSchedule();
+ obp+=sizeof(long);
+ }
+ else if(type1==DEF_DOUBLE){
+ ChangeTypeToDouble(type2);
+
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,CaseTypeSize
+ op_add_esp(CaseTypeSize);
+
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //fcompp
+ OpBuffer[obp++]=(char)0xDE;
+ OpBuffer[obp++]=(char)0xD9;
+
+ //fnstsw ax
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0xE0;
+
+ //test ah,40
+ OpBuffer[obp++]=(char)0xF6;
+ OpBuffer[obp++]=(char)0xC4;
+ OpBuffer[obp++]=(char)0x40;
+
+ //jne ...
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x85;
+ AddCaseSchedule();
+ obp+=sizeof(long);
+ }
+ else if(type1==DEF_SINGLE){
+ ChangeTypeToSingle(type2);
+
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //add esp,CaseTypeSize
+ op_add_esp(CaseTypeSize);
+
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //fcompp
+ OpBuffer[obp++]=(char)0xDE;
+ OpBuffer[obp++]=(char)0xD9;
+
+ //fnstsw ax
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0xE0;
+
+ //test ah,40
+ OpBuffer[obp++]=(char)0xF6;
+ OpBuffer[obp++]=(char)0xC4;
+ OpBuffer[obp++]=(char)0x40;
+
+ //jne ...
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x85;
+ AddCaseSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //その他整数型
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //mov eax,dword ptr[esp]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+
+ //cmp eax,ebx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xC3;
+
+ //je ...
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x84;
+ AddCaseSchedule();
+ obp+=sizeof(long);
+ }
+
+ if(basbuf[i]!=',') break;
+ }
+ }
+ if(basbuf[i]==1&&basbuf[i+1]==ESC_CASEELSE){
+ sw=1;
+
+ //jmp ...
+ OpBuffer[obp++]=(char)0xE9;
+ AddCaseSchedule();
+ obp+=sizeof(long);
+ }
+ }
+
+ //レキシカルスコープをレベルアップ
+ obj_LexScopes.LevelUp(obp);
+
+ //Select Case内をコンパイル
+ CompileBuffer(ESC_ENDSELECT,0);
+
+ //jmp EndSelect
+ OpBuffer[obp++]=(char)0xE9;
+ AddCaseSchedule();
+ obp+=sizeof(long);
+
+ //最終スケジュール
+ for(i=NowCaseSchedule;iname[0]==1&&pCompilingSubInfo->name[1]==ESC_OPERATOR)
+ temp="_System_ReturnValue";
+ else temp=pCompilingSubInfo->name;
+
+ char temporary[VN_SIZE];
+ sprintf(temporary,"%s=%s",temp,Parameter);
+ OpcodeCalc(temporary);
+ }
+
+ //プロシージャを抜け出す(C言語のreturnと同様の処理を行う)
+ OpcodeExitSub();
+ }
+}
+
+void Opcode_Input(char *Parameter){
+ extern int cp;
+ int i2,i3,i4,i5,type;
+ BOOL bFile;
+ char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
+
+ KillStringSpaces(Parameter);
+
+ if(Parameter[0]=='#'){
+ bFile=1;
+ for(i2=0,i3=1;;i2++,i3++){
+ buffer[i2]=Parameter[i3];
+ if(Parameter[i3]==','||Parameter[i3]=='\0') break;
+ }
+ buffer[i2+1]=0;
+ i2=i3+1;
+ }
+ else{
+ bFile=0;
+ i2=0;
+ buffer[0]=0;
+
+ //表示用文字列パラメータをセット
+ if(Parameter[0]=='\"'){
+ buffer[0]='\"';
+ for(i2=1;;i2++){
+ if(Parameter[i2]=='\"'){
+ buffer[i2]=0;
+ break;
+ }
+ buffer[i2]=Parameter[i2];
+ }
+ if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
+ else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
+ else SetError(10,"Input",cp);
+ i2+=2;
+ }
+ else if((Parameter[0]=='e'||Parameter[0]=='E')&&
+ (Parameter[1]=='x'||Parameter[1]=='X')&&
+ Parameter[2]=='\"'){
+ memcpy(buffer,Parameter,3);
+ for(i2=3;;i2++){
+ if(Parameter[i2]=='\"'){
+ buffer[i2]=0;
+ break;
+ }
+ buffer[i2]=Parameter[i2];
+ }
+ if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
+ else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
+ else SetError(10,"Input",cp);
+ i2+=2;
+ }
+ else{
+ lstrcpy(buffer,"\"? \"");
+ i2=0;
+ }
+ }
+
+ //変数ポインタ、変数のタイプをセット
+ i4=0;
+ while(1){
+ for(i3=0;;i2++,i3++){
+ if(Parameter[i2]=='('){
+ i5=GetStringInPare(temporary+i3,Parameter+i2);
+ i2+=i5-1;
+ i3+=i5-1;
+ }
+ if(Parameter[i2]=='['){
+ i5=GetStringInBracket(temporary+i3,Parameter+i2);
+ i2+=i5-1;
+ i3+=i5-1;
+ }
+ if(Parameter[i2]==','){
+ temporary[i3]=0;
+ i2++;
+ break;
+ }
+ temporary[i3]=Parameter[i2];
+ if(Parameter[i2]=='\0') break;
+ }
+ if(temporary[0]=='\0'){
+ SetError(10,"Input",cp);
+ return;
+ }
+
+ LONG_PTR lpIndex;
+ RELATIVE_VAR RelativeVar;
+ GetVarOffset(1,temporary,&type,&RelativeVar,&lpIndex);
+
+ sprintf(temp2,"_System_InputDataPtr[%d]=VarPtr(%s)",i4,temporary);
+ OpcodeCalc(temp2);
+
+ if(type==DEF_LONG) type=DEF_DWORD;
+ else if(type==DEF_INTEGER) type=DEF_WORD;
+ else if(type==DEF_OBJECT){
+ CClass *pobj_Class=(CClass *)lpIndex;
+ if(lstrcmp(pobj_Class->name,"String")==0) type=DEF_STRING;
+ }
+ sprintf(temp2,"_System_InputDataType[%d]=%d",i4,type);
+ OpcodeCalc(temp2);
+
+ i4++;
+ if(Parameter[i2]=='\0') break;
+ }
+ sprintf(temp2,"_System_InputDataPtr[%d]=0",i4);
+ OpcodeCalc(temp2);
+
+ SUBINFO *psi;
+ if(bFile) psi=GetSubHash("INPUT_FromFile");
+ else psi=GetSubHash("INPUT_FromPrompt");
+ if(!psi){
+ SetError(3,"Input",cp);
+ return;
+ }
+ Opcode_CallProc(buffer,psi,0,0,"",0);
+}
+void Opcode_PrintUsing(char *Parameter,char *buffer,BOOL bFile){
+ extern int cp;
+ int i2,i3,i4,i5;
+ char temporary[VN_SIZE],temp2[8192];
+ BOOL bReturnLine;
+
+ i2=lstrlen(Parameter);
+ if(Parameter[i2-1]==';'){
+ bReturnLine=0;
+ Parameter[i2-1]=0;
+ }
+ else bReturnLine=1;
+
+ i3=lstrlen(buffer);
+ for(i2=0;;i2++,i3++){
+ if(Parameter[i2]==';'){
+ buffer[i3]=0;
+ break;
+ }
+ buffer[i3]=Parameter[i2];
+ if(Parameter[i2]=='\0') break;
+ }
+ if(Parameter[i2]==';') i2++;
+
+ if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\"");
+
+ //データポインタ、データのタイプをセット
+ i4=0;
+ while(1){
+ for(i3=0;;i2++,i3++){
+ if(Parameter[i2]=='\"'){
+ temporary[i3]=Parameter[i2];
+ for(i2++,i3++;;i2++,i3++){
+ temporary[i3]=Parameter[i2];
+ if(Parameter[i2]=='\"') break;
+ }
+ continue;
+ }
+ if(Parameter[i2]=='('){
+ i5=GetStringInPare(temporary+i3,Parameter+i2);
+ i2+=i5-1;
+ i3+=i5-1;
+ continue;
+ }
+ if(Parameter[i2]=='['){
+ i5=GetStringInBracket(temporary+i3,Parameter+i2);
+ i2+=i5-1;
+ i3+=i5-1;
+ continue;
+ }
+ if(Parameter[i2]==','){
+ temporary[i3]=0;
+ i2++;
+ break;
+ }
+ temporary[i3]=Parameter[i2];
+ if(Parameter[i2]=='\0') break;
+ }
+ if(temporary[0]=='\0'){
+ SetError(10,"Print",cp);
+ return;
+ }
+
+ int iResult;
+ iResult=IsStrCalculation(temporary);
+
+ if(iResult==1){
+ //文字列
+ sprintf(temp2,"_System_UsingStrData[%d]=%s",i4,temporary);
+ OpcodeCalc(temp2);
+
+ sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_STRING);
+ OpcodeCalc(temp2);
+ }
+ else if(iResult==0){
+ //数値
+ sprintf(temp2,"_System_UsingDblData[%d]=%s",i4,temporary);
+ OpcodeCalc(temp2);
+
+ sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_DOUBLE);
+ OpcodeCalc(temp2);
+ }
+ //else if(iResult==-1) エラー
+
+ i4++;
+ if(Parameter[i2]=='\0') break;
+ }
+ sprintf(temp2,"_System_UsingDataType[%d]=-1",i4);
+ OpcodeCalc(temp2);
+
+ SUBINFO *psi;
+ if(bFile) psi=GetSubHash("PRINTUSING_ToFile");
+ else psi=GetSubHash("PRINTUSING_ToPrompt");
+ if(!psi){
+ SetError(3,"Print",cp);
+ return;
+ }
+ Opcode_CallProc(buffer,psi,0,0,"",0);
+}
+void Opcode_Print(char *Parameter,BOOL bWrite){
+ int i2,i3,i4,sw;
+ char temporary[VN_SIZE],buffer[VN_SIZE];
+ BOOL bFile;
+
+ KillStringSpaces(Parameter);
+
+ if(Parameter[0]=='#'){
+ bFile=1;
+ for(i2=0,i3=1;;i2++,i3++){
+ buffer[i2]=Parameter[i3];
+ if(Parameter[i3]==','||Parameter[i3]=='\0') break;
+ }
+ buffer[i2+1]=0;
+ if(Parameter[i3]==',') i3++;
+ i2=i3;
+ }
+ else{
+ bFile=0;
+ i2=0;
+ buffer[0]=0;
+ }
+ if(Parameter[i2]==1&&Parameter[i2+1]==ESC_USING){
+ Opcode_PrintUsing(Parameter+i2+2,buffer,bFile);
+ return;
+ }
+
+ lstrcat(buffer,"_System_DummyStr+");
+
+ sw=1;
+ while(1){
+ for(i3=0;;i2++,i3++){
+ if(Parameter[i2]=='\"'){
+ temporary[i3]=Parameter[i2];
+ for(i2++,i3++;;i2++,i3++){
+ temporary[i3]=Parameter[i2];
+ if(Parameter[i2]=='\"') break;
+ }
+ continue;
+ }
+ if(Parameter[i2]=='('){
+ i4=GetStringInPare(temporary+i3,Parameter+i2);
+ i2+=i4-1;
+ i3+=i4-1;
+ continue;
+ }
+ if(Parameter[i2]=='['){
+ i4=GetStringInBracket(temporary+i3,Parameter+i2);
+ i2+=i4-1;
+ i3+=i4-1;
+ continue;
+ }
+ if(Parameter[i2]==','||Parameter[i2]==';'){
+ temporary[i3]=0;
+ break;
+ }
+ temporary[i3]=Parameter[i2];
+ if(Parameter[i2]=='\0') break;
+ }
+
+ if(temporary[0]=='\0') lstrcat(buffer,"\"\"");
+ else{
+ int iResult;
+ iResult=IsStrCalculation(temporary);
+ if(iResult==-1){
+ //エラー
+ lstrcat(buffer,"\"\"");
+ }
+ else if(iResult){
+ //文字列
+ lstrcat(buffer,temporary);
+ }
+ else{
+ //数値
+ sprintf(buffer+lstrlen(buffer),"Str$(%s)",temporary);
+ }
+ }
+
+ if(Parameter[i2]==','){
+ if(bWrite) lstrcat(buffer,"+\",\"+");
+ else lstrcat(buffer,"+\"\t\"+");
+ }
+ else if(Parameter[i2]==';'){
+ if(Parameter[i2+1]=='\0'){
+ sw=0;
+ break;
+ }
+ if(bWrite) lstrcat(buffer,"+\",\"+");
+ else lstrcat(buffer,"+\" \"+");
+ }
+ else if(Parameter[i2]=='\0') break;
+
+ i2++;
+ }
+
+ if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
+
+ SUBINFO *psi;
+ if(bFile) psi=GetSubHash("PRINT_ToFile");
+ else psi=GetSubHash("PRINT_ToPrompt");
+ if(!psi){
+ SetError(3,"Print",cp);
+ return;
+ }
+ Opcode_CallProc(buffer,psi,0,0,"",0);
+}
+
+
+
+
+////////////
+// ポインタ
+
+void OpcodeCallPtr(char *Parameter){
+ extern HANDLE hHeap;
+ int i,i2,i3,num,types[255];
+ BOOL bCdecl;
+ char szFuncPtr[VN_SIZE],temporary[VN_SIZE],*Parms[255];
+
+ //関数ポインタを取得
+ i=GetOneParameter(Parameter,0,szFuncPtr);
+
+ if(lstrcmpi(szFuncPtr,"cdecl")==0){
+ //cdeclが指定された場合は、第2パラメータを関数ポインタとして扱う
+ bCdecl=1;
+
+ i=GetOneParameter(Parameter,i,szFuncPtr);
+ }
+ else bCdecl=0;
+
+ if(Parameter[0]=='\0'){
+ SetError(10,"CallPtr",cp);
+ }
+
+ num=0;
+ while(Parameter[i]){
+ i=GetOneParameter(Parameter,i,temporary);
+
+ types[num]=DEF_LONG;
+
+ for(i2=0;;i2++){
+ if(temporary[i2]=='\0') break;
+ if(temporary[i2]==1&&temporary[i2+1]==ESC_AS){
+ LONG_PTR lp;
+ types[num]=GetTypeFixed(temporary+i2+2,&lp);
+
+ if(types[num]==DEF_OBJECT){
+ SetError(11,temporary+i2+2,cp);
+ }
+
+ temporary[i2]=0;
+ break;
+ }
+ }
+
+ Parms[num]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+ lstrcpy(Parms[num],temporary);
+
+ num++;
+ }
+
+ int ParmSize=0;
+
+ for(i=num-1;i>=0;i--){
+ //スタックへプッシュ
+ i3=NumOpe(Parms[i],0,0,0);
+
+ switch(types[i]){
+ case DEF_INT64:
+ case DEF_QWORD:
+ ChangeTypeToInt64(i3);
+ break;
+ case DEF_SINGLE:
+ ChangeTypeToSingle(i3);
+ break;
+ case DEF_DOUBLE:
+ ChangeTypeToDouble(i3);
+ break;
+
+ default:
+ ChangeTypeToLong(i3);
+ break;
+ }
+
+ ParmSize+=GetTypeSize(types[i],0);
+
+ HeapDefaultFree(Parms[i]);
+ }
+
+ i3=NumOpe(szFuncPtr,0,0,0);
+ ChangeTypeToLong(i3);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //call eax
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xD0;
+
+ if(bCdecl){
+ //スタックを戻す
+
+ //add esp,ParmSize
+ op_add_esp(ParmSize);
+ }
+}
+
+void OpcodeSetPtrData(char *Parameter,int type){
+ int i,i2;
+ char temporary[VN_SIZE];
+
+ if(Parameter[0]=='('){
+ i=JumpStringInPare(Parameter,1);
+ if(Parameter[i+1]=='\0'){
+ for(i=0;;i++){
+ Parameter[i]=Parameter[i+1];
+ if(Parameter[i]=='\0') break;
+ }
+ Parameter[i-1]=0;
+ }
+ }
+
+ //第1パラメータを取得
+ i=GetOneParameter(Parameter,0,temporary);
+ if(!Parameter[i]){
+ SetError(1,NULL,cp);
+ return;
+ }
+
+ i2=NumOpe(temporary,0,0,0);
+ ChangeTypeToLong(i2);
+
+ //第2パラメータを取得
+ i=GetOneParameter(Parameter,i,temporary);
+ if(Parameter[i]){
+ SetError(1,NULL,cp);
+ return;
+ }
+
+ i2=NumOpe(temporary,0,0,0);
+ if(type==DEF_DOUBLE){
+ ChangeTypeToDouble_ToFpuReg(i2);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //fstp qword ptr[eax]
+ OpBuffer[obp++]=(char)0xDD;
+ OpBuffer[obp++]=(char)0x18;
+ }
+ else if(type==DEF_SINGLE){
+ ChangeTypeToSingle(i2);
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //mov dword ptr[eax],ebx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x18;
+ }
+ else if(type==DEF_QWORD){
+ ChangeTypeToInt64(i2);
+
+ //pop ecx
+ op_pop(REG_ECX);
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //mov dword ptr[eax],ecx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x08;
+
+ //mov dword ptr[eax+sizeof(long)],ebx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x58;
+ OpBuffer[obp++]=(char)0x04;
+ }
+ else if(type==DEF_DWORD){
+ ChangeTypeToLong(i2);
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //mov dword ptr[eax],ebx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x18;
+ }
+ else if(type==DEF_WORD){
+ ChangeTypeToLong(i2);
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //mov word ptr[eax],bx
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x18;
+ }
+ else if(type==DEF_BYTE){
+ ChangeTypeToLong(i2);
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //mov byte ptr[eax],bl
+ OpBuffer[obp++]=(char)0x88;
+ OpBuffer[obp++]=(char)0x18;
+ }
+}
Index: /BasicCompiler32/Compile_Var.cpp
===================================================================
--- /BasicCompiler32/Compile_Var.cpp (revision 3)
+++ /BasicCompiler32/Compile_Var.cpp (revision 3)
@@ -0,0 +1,1242 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+//変数
+VARIABLE *GlobalVar;
+int MaxGlobalVarNum;
+int AllGlobalVarSize;
+int AllInitGlobalVarSize;
+VARIABLE *LocalVar;
+int MaxLocalVarNum;
+int AllLocalVarSize;
+
+void SetRelativeOffset(int *pType,LONG_PTR lpIndex,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
+ int i2;
+
+ PushLongVariable(pRelativeVar);
+
+ i2=NumOpe(lpPtrOffset,0,0,0);
+ ChangeTypeToLong(i2);
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ if(PTR_LEVEL(*pType)){
+ *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1);
+ if((*pType)==DEF_OBJECT){
+ //imul ebx,objsize
+ OpBuffer[obp++]=(char)0x69;
+ OpBuffer[obp++]=(char)0xDB;
+ *((long *)(OpBuffer+obp))=GetSizeOfClassMember((CClass *)lpIndex,NULL,NULL);
+ obp+=sizeof(long);
+ }
+ else{
+ i2=GetTypeSize(*pType,-1);
+ if(i2>=2){
+ //imul ebx,i2
+ OpBuffer[obp++]=(char)0x6B;
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)i2;
+ }
+ }
+ }
+ else{
+ //エラー
+ SetError(1,NULL,cp);
+ return;
+ }
+
+ //pop ecx
+ op_pop(REG_ECX);
+
+ //add ecx,ebx
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xCB;
+}
+BOOL GetArrayOffset(int *SubScripts,char *array,int type,LONG_PTR lpIndex){
+ extern HANDLE hHeap;
+ int i,i2,i3,i4,TypeSize;
+ char temporary[VN_SIZE],*pParm[MAX_PARMS];
+
+ for(i=0,i2=0,i3=0;;i++,i2++){
+ if(array[i]=='('){
+ i4=GetStringInPare(temporary+i2,array+i);
+ i+=i4-1;
+ i2+=i4-1;
+ continue;
+ }
+ if(array[i]=='['){
+ i4=GetStringInBracket(temporary+i2,array+i);
+ i+=i4-1;
+ i2+=i4-1;
+ continue;
+ }
+ if(array[i]==','||array[i]=='\0'){
+ if(SubScripts[i3]==-1){
+ for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+ return 0;
+ }
+
+ temporary[i2]=0;
+
+ pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+ lstrcpy(pParm[i3],temporary);
+
+ i3++;
+
+ if(array[i]=='\0'){
+ if(SubScripts[i3]!=-1){
+ for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+ return 0;
+ }
+ break;
+ }
+
+ i2=-1;
+ continue;
+ }
+ temporary[i2]=array[i];
+ }
+
+ //push ecx
+ op_push(REG_ECX);
+
+ //push 0
+ op_push_value(0);
+
+ for(i=i3-1;i>=0;i--){
+ TYPEINFO TypeInfo;
+ BOOL bUseHeap;
+ TypeInfo.type=NumOpe(pParm[i],DEF_LONG,-1,&TypeInfo.u.lpIndex,&bUseHeap);
+ if(TypeInfo.type==DEF_OBJECT){
+ //キャスト演算子のオーバーロードに対応する
+ CallCastOperatorProc(
+ TypeInfo.type,TypeInfo.u.lpIndex,
+ bUseHeap,DEF_LONG,-1);
+ TypeInfo.type=DEF_LONG;
+ }
+ ChangeTypeToLong(TypeInfo.type);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ for(i2=i+1,i4=1;i2"参照のときは1
+ lstrcpy(VarName,member);
+ if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
+
+ ////////////////////////////
+ // メンバオフセットを取得
+ ////////////////////////////
+
+ offset=GetSizeOfClassMember(pobj_c,VarName,&i);
+ if(i==pobj_c->iMemberNum){
+ if(bError) SetError(103,VarName,cp);
+ return 0;
+ }
+
+ //アクセシビリティをチェック
+ if(pobj_c==pobj_CompilingClass){
+ //同一クラスオブジェクトの場合はプライベートアクセスを容認する
+ if(pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
+ if(bError) SetError(107,VarName,cp);
+ return 0;
+ }
+ }
+ else{
+ if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
+ pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
+ if(bError) SetError(107,VarName,cp);
+ return 0;
+ }
+ else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED){
+ if(bError) SetError(108,VarName,cp);
+ return 0;
+ }
+ }
+
+ *pType=pobj_c->ppobj_Member[i]->TypeInfo.type;
+ *plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
+
+ //ポインタ変数の場合
+ if(IsPtrType(*pType)){
+ if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
+ lstrcpy(lpPtrOffset,array);
+ array[0]=0;
+ }
+ }
+ else{
+ if(lpPtrOffset[0]){
+ if(bError) SetError(16,member,cp);
+ return 0;
+ }
+ }
+
+ if(offset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+
+ if(array[0]){
+ //配列オフセット
+ if(!GetArrayOffset(pobj_c->ppobj_Member[i]->SubScripts,array,*pType,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex))
+ if(bError) SetError(14,member,cp);
+ }
+ else if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
+ *pType|=FLAG_PTR;
+ }
+
+ if(NestMember[0]){
+ //入れ子構造の場合
+
+ if(*pType==DEF_OBJECT){
+ if(RefType!=DEF_OBJECT){
+ if(bError) SetError(104,member,cp);
+ return 0;
+ }
+ }
+ else if(*pType==DEF_PTR_OBJECT){
+ //構造体ポインタ型メンバ変数
+
+ if(lpPtrOffset[0]){
+ //pObj[n].member
+ if(RefType!=DEF_OBJECT){
+ if(bError) SetError(104,member,cp);
+ return 0;
+ }
+
+ //直接参照に切り替え
+ SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ lpPtrOffset[0]=0;
+ }
+ else{
+ //pObj->member
+ if(RefType!=DEF_PTR_OBJECT){
+ if(bError) SetError(104,member,cp);
+ return 0;
+ }
+
+ if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+ //mov ecx,dword ptr[ecx]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x09;
+ }
+ else{
+ //直接参照に切り替え
+ SetVarPtrToEax(pRelativeVar);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ //mov ecx,dword ptr[eax]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x08;
+ }
+ }
+ }
+ else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){
+ //構造体ポインタのポインタ型メンバ変数
+
+ if(lpPtrOffset[0]){
+ //ppObj[n]->member
+ if(RefType!=DEF_PTR_OBJECT){
+ if(bError) SetError(104,member,cp);
+ return 0;
+ }
+
+ //直接参照に切り替え
+ SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ lpPtrOffset[0]=0;
+
+ //mov ecx,dword ptr[ecx]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x09;
+ }
+ else{
+ if(bError) SetError(104,member,cp);
+ return 0;
+ }
+ }
+
+ if(!GetMemberOffset(bError,pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
+ NestMember,
+ pType,
+ pRelativeVar,
+ plpNestIndex,
+ 0)) return 0;
+ }
+
+ if(lpPtrOffset[0]){
+ SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+ }
+
+ return 1;
+}
+void GetWithName(char *buffer){
+ extern WITHINFO WithInfo;
+ int i;
+
+ buffer[0]=0;
+ for(i=0;i=0;i--){ //レキシカルスコープを考慮してバックサーチ
+ if(LocalVar[i].bLiving){
+ if(lstrcmp(VarName,LocalVar[i].name)==0) break;
+ }
+ }
+ if(i>=0){
+ //ポインタ変数の場合
+ if(IsPtrType(LocalVar[i].type)){
+ if(LocalVar[i].SubScripts[0]==-1){
+ lstrcpy(lpPtrOffset,array);
+ array[0]=0;
+ }
+ }
+ else{
+ if(lpPtrOffset[0]){
+ SetError(16,variable,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+ }
+
+ pRelativeVar->offset=-LocalVar[i].offset;
+ pRelativeVar->bOffsetOffset=0;
+ if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL;
+ else pRelativeVar->dwKind=VAR_LOCAL;
+ *pType=LocalVar[i].type;
+ lpIndex=LocalVar[i].u.index;
+ if(plpIndex) *plpIndex=lpIndex;
+ pSubScripts=LocalVar[i].SubScripts;
+
+ goto ok;
+ }
+ }
+
+ if(pobj_CompilingClass){
+ //////////////////////
+ // クラスメンバの参照
+ //////////////////////
+
+ if(lstrcmpi(variable,"This")==0){
+ //Thisオブジェクト
+
+ //Thisポインタをecxにコピー
+ SetThisPtrToReg(REG_ECX);
+
+ *pType=DEF_OBJECT;
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ if(plpIndex) *plpIndex=(LONG_PTR)pobj_CompilingClass;
+ return 1;
+ }
+
+ if(_memicmp(variable,"This.",5)==0){
+ //Thisオブジェクトのメンバを参照するとき
+ SlideString(variable+5,-5);
+ lstrcpy(VarName,variable);
+ }
+ else{
+ //クラス内メンバを参照するとき(通常)
+
+ for(i=0;iiMemberNum;i++){
+ if(lstrcmp(VarName,pobj_CompilingClass->ppobj_Member[i]->name)==0) break;
+ }
+ if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
+ }
+
+ /////////////////////////////
+ // thisポインタをecxにセット
+
+ //Thisポインタをecxにコピー
+ SetThisPtrToReg(REG_ECX);
+
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+ if(!GetMemberOffset(bError,pobj_CompilingClass,variable,pType,pRelativeVar,&lpIndex,1)) return 0;
+ if(plpIndex) *plpIndex=lpIndex;
+ return 1;
+ }
+
+NonClassMember:
+
+ //////////////////////////
+ // 静的ローカル変数
+ // ※"Static.Object.Method.Variable"
+ //////////////////////////
+
+ char temporary[VN_SIZE];
+ extern SUBINFO *pCompilingSubInfo;
+ if(pCompilingSubInfo){
+ GetNowStaticVarFullName(VarName,temporary);
+
+ for(i=0;i=0;i--){ //レキシカルスコープを考慮してバックサーチ
+ if(GlobalVar[i].bLiving){
+ if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
+ }
+ }
+ if(i>=0){
+ goto GlobalOk;
+ }
+
+
+ //////////////////////////
+ // クラスの静的メンバ
+ //////////////////////////
+
+ if(member[0]){
+ lstrcpy(temporary,member);
+ GetVarFormatString(temporary,array,lpPtrOffset,member,&i);
+
+ char temp2[VN_SIZE];
+ sprintf(temp2,"%s.%s",VarName,temporary);
+ for(i=0;iname,VarName);
+ for(i=0;idwKind=NON_VAR;
+ return 0;
+
+
+GlobalOk:
+
+ //ポインタ変数の場合
+ if(IsPtrType(GlobalVar[i].type)){
+ if(GlobalVar[i].SubScripts[0]==-1){
+ lstrcpy(lpPtrOffset,array);
+ array[0]=0;
+ }
+ }
+ else{
+ if(lpPtrOffset[0]){
+ SetError(16,variable,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+ }
+
+ pRelativeVar->offset=GlobalVar[i].offset;
+ pRelativeVar->bOffsetOffset=0;
+ pRelativeVar->dwKind=VAR_GLOBAL;
+ *pType=GlobalVar[i].type;
+ lpIndex=GlobalVar[i].u.index;
+ if(plpIndex) *plpIndex=lpIndex;
+ pSubScripts=GlobalVar[i].SubScripts;
+
+
+ok:
+
+
+ if(array[0]==0&&pSubScripts[0]!=-1){
+ //配列の先頭ポインタを示す場合
+ *pType|=FLAG_PTR;
+ if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
+ return 1;
+ }
+
+ if(array[0]||member[0]){
+ //xor ecx,ecx(ecxを0に初期化する)
+ //※ecxは変数ベースアドレスからの相対オフセットを示す
+ op_zero_reg(REG_ECX);
+
+ pRelativeVar->bOffsetOffset=1;
+ }
+ if(array[0]){
+ if(!GetArrayOffset(pSubScripts,array,*pType,lpIndex)){
+ SetError(14,variable,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+ }
+ if(member[0]){
+ if(*pType==DEF_OBJECT){
+ //実態オブジェクトのメンバを参照(obj.member)
+ if(RefType!=DEF_OBJECT){
+ SetError(104,VarName,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+
+ LONG_PTR lp2;
+ if(!GetMemberOffset(bError,(CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0)) return 0;
+ if(plpIndex) *plpIndex=lp2;
+ }
+ else if(*pType==DEF_PTR_OBJECT){
+ //ポインタオブジェクトが示すメンバを参照
+ if(lpPtrOffset[0]){
+ //pObj[n].member
+ if(RefType!=DEF_OBJECT){
+ SetError(104,VarName,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+ SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ LONG_PTR lp2;
+ if(!GetMemberOffset(bError,(CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0)) return 0;
+ if(plpIndex) *plpIndex=lp2;
+ }
+ else{
+ //pObj->member
+ if(RefType!=DEF_PTR_OBJECT){
+ SetError(104,VarName,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+
+ SetVarPtrToEax(pRelativeVar);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ //mov ecx,dword ptr[eax]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x08;
+
+ LONG_PTR lp2;
+ if(!GetMemberOffset(bError,(CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0)) return 0;
+ if(plpIndex) *plpIndex=lp2;
+ }
+ }
+ else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){
+ //ポインタオブジェクトが示すメンバを参照
+ if(lpPtrOffset[0]){
+ //ppObj[n]->member
+ if(RefType!=DEF_PTR_OBJECT){
+ SetError(104,VarName,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+
+ SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+
+ SetVarPtrToEax(pRelativeVar);
+
+ //mov ecx,dword ptr[eax]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x08;
+
+ LONG_PTR lp2;
+ if(!GetMemberOffset(bError,(CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0)) return 0;
+ if(plpIndex) *plpIndex=lp2;
+ }
+ else{
+ SetError(104,VarName,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+ }
+ else{
+ SetError(102,VarName,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+ return 1;
+ }
+
+ if(lpPtrOffset[0]){
+ SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+ }
+
+ return 1;
+}
+
+BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf){
+ extern BYTE *initGlobalBuf;
+ int i,i2,i3,TypeSize;
+ char temporary[VN_SIZE];
+
+ if(InitBuf[0]=='['){
+ SlideString(InitBuf+1,-1);
+ InitBuf[lstrlen(InitBuf)-1]=0;
+
+ TypeSize=GetTypeSize(type,lpIndex);
+
+ if(SubScripts[0]!=-1){
+ TypeSize*=JumpSubScripts(SubScripts+1);
+ i=0;
+ i2=0;
+ while(1){
+ if(SubScripts[0]iMemberNum;i2++){
+ i=GetOneParameter(InitBuf,i,temporary);
+
+ i3=GetSizeOfClassMember(pobj_c,pobj_c->ppobj_Member[i2]->name,NULL);
+
+ if(!SetInitGlobalData(offset+i3,
+ pobj_c->ppobj_Member[i2]->TypeInfo.type,
+ pobj_c->ppobj_Member[i2]->TypeInfo.u.lpIndex,
+ pobj_c->ppobj_Member[i2]->SubScripts,
+ temporary)) return 0;
+
+ if(InitBuf[i]=='\0') break;
+ }
+ if(i2+1!=pobj_c->iMemberNum){
+ SetError(41,0,cp);
+ return 0;
+ }
+ return 1;
+ }
+
+ SetError(41,0,cp);
+ return 0;
+ }
+
+ if(SubScripts[0]!=-1){
+ SetError(41,0,cp);
+ return 0;
+ }
+
+ double dbl;
+ _int64 i64data;
+ int CalcType;
+ LONG_PTR lpCalcIndex;
+ CalcType=StaticCalculation(true, InitBuf,type,&i64data,&lpCalcIndex);
+ if(IsRealNumberType(CalcType)){
+ memcpy(&dbl,&i64data,sizeof(double));
+ i64data=(_int64)dbl;
+ }
+ else dbl=(double)i64data;
+
+ //型チェック
+ CheckDifferentType(
+ type,
+ lpIndex,
+ CalcType,
+ lpCalcIndex,
+ 0,0);
+
+ if(type==DEF_DOUBLE)
+ *(double *)(initGlobalBuf+offset)=(double)dbl;
+ else if(type==DEF_SINGLE)
+ *(float *)(initGlobalBuf+offset)=(float)dbl;
+ else if(type==DEF_INT64||type==DEF_QWORD)
+ *(_int64 *)(initGlobalBuf+offset)=i64data;
+ else if(type==DEF_LONG||type==DEF_DWORD||IsPtrType(type)){
+ if(type==DEF_PTR_BYTE&&lpCalcIndex==LITERAL_STRING){
+ //文字列定数のとき
+
+ char *temp;
+ temp=(char *)i64data;
+ i2=AddDataTable(temp,lstrlen(temp));
+ HeapDefaultFree(temp);
+
+ //mov eax,DataPos
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=(long)i2;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+
+ //mov dword ptr[offset],eax
+ OpBuffer[obp++]=(char)0xA3;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ *(DWORD *)(initGlobalBuf+offset)=(DWORD)i64data;
+ }
+ }
+ else if(type==DEF_INTEGER||type==DEF_WORD)
+ *(WORD *)(initGlobalBuf+offset)=(WORD)i64data;
+ else if(type==DEF_CHAR||type==DEF_BYTE)
+ *(BYTE *)(initGlobalBuf+offset)=(BYTE)i64data;
+ //String型が未完成
+ return 1;
+}
+BOOL InitLocalVar(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf){
+ int i,i2,i3,TypeSize;
+ char temporary[VN_SIZE];
+
+ if(InitBuf[0]=='['){
+ SlideString(InitBuf+1,-1);
+ InitBuf[lstrlen(InitBuf)-1]=0;
+
+ TypeSize=GetTypeSize(type,lpIndex);
+
+ if(SubScripts[0]!=-1){
+ TypeSize*=JumpSubScripts(SubScripts+1);
+ i=0;
+ i2=0;
+ while(1){
+ if(SubScripts[0]iMemberNum;i2++){
+ i=GetOneParameter(InitBuf,i,temporary);
+
+ i3=GetSizeOfClassMember(pobj_c,pobj_c->ppobj_Member[i2]->name,NULL);
+
+ if(!InitLocalVar(offset+i3,
+ pobj_c->ppobj_Member[i2]->TypeInfo.type,
+ pobj_c->ppobj_Member[i2]->TypeInfo.u.lpIndex,
+ pobj_c->ppobj_Member[i2]->SubScripts,
+ temporary)) return 0;
+
+ if(InitBuf[i]=='\0') break;
+ }
+ if(i2+1!=pobj_c->iMemberNum){
+ SetError(41,0,cp);
+ return 0;
+ }
+ return 1;
+ }
+
+ SetError(41,0,cp);
+ return 0;
+ }
+
+ if(SubScripts[0]!=-1){
+ SetError(41,0,cp);
+ return 0;
+ }
+
+ double dbl;
+ _int64 i64data;
+ int CalcType;
+ LONG_PTR lpCalcIndex;
+ CalcType=StaticCalculation(true, InitBuf,type,&i64data,&lpCalcIndex);
+ if(IsRealNumberType(CalcType)){
+ memcpy(&dbl,&i64data,sizeof(double));
+ i64data=(_int64)dbl;
+ }
+ else dbl=(double)i64data;
+
+ //型チェック
+ CheckDifferentType(
+ type,
+ lpIndex,
+ CalcType,
+ lpCalcIndex,
+ 0,0);
+
+ if(type==DEF_DOUBLE){
+ //mov eax,HILONG(dbl)
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=(long)*(long *)(((char *)(&dbl))+4);
+ obp+=sizeof(long);
+
+ //mov dword ptr[ebp+offset+sizeof(long)],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset+sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //mov eax,LOLONG(dbl)
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=*(long *)(&dbl);
+ obp+=sizeof(long);
+
+ //mov dword ptr[ebp+offset],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else if(type==DEF_SINGLE){
+ float flt;
+ flt=(float)dbl;
+ //mov eax,InitValue
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=*(long *)&flt;
+ obp+=sizeof(long);
+
+ //mov dword ptr[ebp+offset],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else if(type==DEF_INT64||type==DEF_QWORD){
+ //mov eax,HILONG(i64data)
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=(long)*(long *)(((char *)(&i64data))+4);
+ obp+=sizeof(long);
+
+ //mov dword ptr[ebp+offset+sizeof(long)],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset+sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //mov eax,LOLONG(i64data)
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=*(long *)(&i64data);
+ obp+=sizeof(long);
+
+ //mov dword ptr[ebp+offset],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else if(type==DEF_LONG||type==DEF_DWORD||IsPtrType(type)){
+ if(type==DEF_PTR_BYTE&&lpCalcIndex==LITERAL_STRING){
+ //文字列定数のとき
+
+ char *temp;
+ temp=(char *)i64data;
+ i2=AddDataTable(temp,lstrlen(temp));
+ HeapDefaultFree(temp);
+
+ //mov eax,DataPos
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=(long)i2;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov eax,InitValue
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=(long)i64data;
+ obp+=sizeof(long);
+ }
+
+ //mov dword ptr[ebp+offset],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else if(type==DEF_INTEGER||type==DEF_WORD){
+ //mov ax,InitValue
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0xB8;
+ *((WORD *)(OpBuffer+obp))=(WORD)i64data;
+ obp+=sizeof(WORD);
+
+ //mov word ptr[ebp+offset],ax
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else if(type==DEF_CHAR||type==DEF_BYTE){
+ //mov byte ptr[ebp+offset],InitValue
+ OpBuffer[obp++]=(char)0xC6;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ *((BYTE *)(OpBuffer+obp))=(BYTE)i64data;
+ obp+=sizeof(BYTE);
+ }
+ //String型が未完成
+ return 1;
+}
+
+void dim(char *Parameter,DWORD dwFlag){
+ extern BOOL bCompilingGlobal;
+ extern HANDLE hHeap;
+ int i2,i3,VarSize;
+
+ //構文を解析
+ char VarName[VN_SIZE];
+ int SubScripts[MAX_ARRAYDIM];
+ TYPEINFO TypeInfo;
+ char InitBuf[8192];
+ char ConstractParameter[VN_SIZE];
+ if(!GetDimentionFormat(Parameter,VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))
+ return;
+
+ //タイプサイズを取得
+ int TypeSize;
+ TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
+
+ //定数と2重定義されていないかを調べる
+ if(GetConstHash(VarName)){
+ SetError(15,VarName,cp);
+ return;
+ }
+
+ if(dwFlag&DIMFLAG_STATIC){
+ if(bCompilingGlobal){
+ SetError(60,NULL,cp);
+ return;
+ }
+
+ /////////////////////
+ // Static変数
+ // ※"Static.Object.Method.Variable"
+ /////////////////////
+
+ char temporary[VN_SIZE];
+ GetNowStaticVarFullName(VarName,temporary);
+
+ AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
+
+ /*
+ Note: 静的変数のコンストラクタ呼び出しは
+ _System_InitStaticLocalVariables関数内で一括して行う
+ */
+ }
+ else{
+ if(bCompilingGlobal){
+ /////////////////////////
+ // グローバル変数
+ /////////////////////////
+
+ AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
+ }
+ else{
+ /////////////////
+ // ローカル変数
+ /////////////////
+
+ for(i2=0;i2bUse=1;
+ pobj_ImportAddrSchedule->add(pdi);
+ obp+=sizeof(long);
+ }
+
+ MaxLocalVarNum++;
+ }
+
+ //コンストラクタ呼び出し
+ if(TypeInfo.type==DEF_OBJECT&&(dwFlag&DIMFLAG_NONCALL_CONSTRACTOR)==0){
+ CallConstractor(VarName,SubScripts,TypeInfo,ConstractParameter);
+ }
+ }
+
+ if(TypeInfo.type==DEF_OBJECT){
+ if(TypeInfo.u.pobj_Class->IsHoldAbstractFunction()){
+ //抽象クラスだったとき
+ SetError(125,TypeInfo.u.pobj_Class->name,cp);
+ }
+ }
+}
+void OpcodeDim(char *Parameter,DWORD dwFlag){
+ int i,i2,i3,IsStr=0;
+ char temporary[8192];
+
+ for(i=0,i2=0;;i++,i2++){
+ if(Parameter[i]=='\"') IsStr^=1;
+ if(Parameter[i]=='('&&IsStr==0){
+ i3=GetStringInPare(temporary+i2,Parameter+i);
+ i+=i3-1;
+ i2+=i3-1;
+ continue;
+ }
+ if(Parameter[i]=='['&&IsStr==0){
+ i3=GetStringInBracket(temporary+i2,Parameter+i);
+ i+=i3-1;
+ i2+=i3-1;
+ continue;
+ }
+ if((Parameter[i]==','&&IsStr==0)||
+ Parameter[i]=='\0'){
+ temporary[i2]=0;
+
+ dim(temporary,dwFlag);
+
+ if(Parameter[i]=='\0') break;
+ i2=-1;
+ continue;
+ }
+ temporary[i2]=Parameter[i];
+ }
+}
+
+void SetVarPtrToEax(RELATIVE_VAR *pRelativeVar){
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //lea eax,dword ptr[ecx+offset]
+ OpBuffer[obp++]=(char)0x8D;
+ OpBuffer[obp++]=(char)0x81;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov eax,offset
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add ecx,offset
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC1;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //lea eax,dword ptr[ebp+ecx]
+ OpBuffer[obp++]=(char)0x8D;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x0D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ //lea eax,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8D;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //mov eax,ecx
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0xC1;
+
+ //add eax,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov eax,dword ptr[ebp+offset]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+ //mov eax,ecx
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0xC1;
+ }
+}
Index: /BasicCompiler32/FunctionValue.h
===================================================================
--- /BasicCompiler32/FunctionValue.h (revision 3)
+++ /BasicCompiler32/FunctionValue.h (revision 3)
@@ -0,0 +1,23 @@
+/* 関数定数 */
+
+//データ型変換
+#define FUNC_CUDBL 0x0210
+#define FUNC_FIX 0x0211
+
+//文字列
+#define FUNC_LEN 0x031D
+
+//メモリ操作
+#define FUNC_VARPTR 0x0591
+
+//その他
+#define FUNC_ADDRESSOF 0x0619
+#define FUNC_SIZEOF 0x0620
+
+//ポインタ
+#define FUNC_GETDOUBLE 0x0630
+#define FUNC_GETSINGLE 0x0631
+#define FUNC_GETQWORD 0x0632
+#define FUNC_GETDWORD 0x0633
+#define FUNC_GETWORD 0x0634
+#define FUNC_GETBYTE 0x0635
Index: /BasicCompiler32/LoopCheck.cpp
===================================================================
--- /BasicCompiler32/LoopCheck.cpp (revision 3)
+++ /BasicCompiler32/LoopCheck.cpp (revision 3)
@@ -0,0 +1,5 @@
+/////////////////////////////////////////////////////
+// 循環参照をチェックするためのクラスモジュール
+/////////////////////////////////////////////////////
+
+
Index: /BasicCompiler32/MakePeHdr.cpp
===================================================================
--- /BasicCompiler32/MakePeHdr.cpp (revision 3)
+++ /BasicCompiler32/MakePeHdr.cpp (revision 3)
@@ -0,0 +1,1670 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+extern int GlobalOpBufferSize;
+
+
+////////////////////////////
+// 特殊関数の構造体ポインタ
+////////////////////////////
+SUBINFO
+ *pSub_System_StartupProgram,
+ *pSub_DebugSys_StartProc,
+ *pSub_DebugSys_EndProc,
+ *pSub_DebugSys_SaveContext,
+ *pSub_System_GetEip,
+ *pSub_System_InitDllGlobalVariables,
+ *pSub_System_InitStaticLocalVariables,
+ *pSub_System_Call_Destructor_of_GlobalObject,
+ *pSub_System_GetSp,
+ *pSub_pow,
+ *pSub_calloc,
+ *pSub_realloc,
+ *pSub_free,
+
+ *pSub_allrem,
+ *pSub_aullrem,
+ *pSub_allmul,
+ *pSub_alldiv,
+ *pSub_aulldiv,
+ *pSub_allshl,
+ *pSub_allshr,
+ *pSub_aullshr;
+
+
+//////////////////////////////
+// 各セクションの位置とサイズ
+int FileSize_CodeSection,
+ FileSize_ExportSection,
+ FileSize_ImportSection,
+ FileSize_DataSection,
+ FileSize_RWSection,
+ FileSize_RSrcSection,
+ FileSize_RelocSection,
+ FileSize_DebugSection;
+int FilePos_CodeSection,
+ FilePos_ExportSection,
+ FilePos_ImportSection,
+ FilePos_DataSection,
+ FilePos_RWSection,
+ FilePos_RSrcSection,
+ FilePos_RelocSection,
+ FilePos_DebugSection;
+int MemSize_CodeSection,
+ MemSize_ExportSection,
+ MemSize_ImportSection,
+ MemSize_DataSection,
+ MemSize_RWSection,
+ MemSize_RSrcSection,
+ MemSize_RelocSection,
+ MemSize_DebugSection;
+int MemPos_CodeSection,
+ MemPos_ExportSection,
+ MemPos_ImportSection,
+ MemPos_DataSection,
+ MemPos_RWSection,
+ MemPos_RSrcSection,
+ MemPos_RelocSection,
+ MemPos_DebugSection;
+int bUse_CodeSection,
+ bUse_ExportSection,
+ bUse_ImportSection,
+ bUse_DataSection,
+ bUse_RWSection,
+ bUse_RSrcSection,
+ bUse_RelocSection,
+ bUse_DebugSection;
+
+
+int AddDataTable(char *buffer,int length){
+ extern HANDLE hHeap;
+ extern char *DataTable;
+ extern int DataTableSize;
+ int RetNum;
+
+ DataTable=(char *)HeapReAlloc(hHeap,0,DataTable,DataTableSize+length+1);
+ memcpy(DataTable+DataTableSize,buffer,length);
+ DataTable[DataTableSize+length]=0;
+
+ RetNum=DataTableSize; //ImageBase+MemPos_DataSectionが後に足される
+
+ DataTableSize+=length+1;
+
+ return RetNum;
+}
+
+void DebugVariable(void){
+ char temporary[255];
+ sprintf(temporary,"_DebugSys_dwThreadID[255]%c%cDWord",1,ESC_AS);
+ OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+ sprintf(temporary,"_DebugSys_ProcNum[255]%c%cDWord",1,ESC_AS);
+ OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+ sprintf(temporary,"_DebugSys_lplpObp[255]%c%c*ULONG_PTR",1,ESC_AS);
+ OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+ sprintf(temporary,"_DebugSys_lplpSpBase[255]%c%c*ULONG_PTR",1,ESC_AS);
+ OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+}
+
+void Compile(void){
+ extern HWND hMainDlg;
+ extern HWND hOwnerEditor;
+ extern HANDLE hHeap;
+ extern BOOL bDebugCompile;
+ extern BOOL bDll;
+ extern DWORD ImageBase;
+ extern int obp_AllocSize;
+ extern char *basbuf;
+ extern char OutputFileName[MAX_PATH];
+
+ int i,i2,i3,i4,i5;
+ char temporary[MAX_PATH],*temp2;
+ HANDLE hFile;
+
+
+ //コードセクションのメモリ上の位置
+ MemPos_CodeSection= 0x1000;
+
+ //データセクションのメモリ上の位置(仮定)
+ MemPos_DataSection= 0x10000000;
+
+
+ //エクスポート セクションを利用するかどうか
+ if(bDll) bUse_ExportSection=1;
+ else bUse_ExportSection=0;
+
+
+ //////////////////
+ // データテーブル
+ extern char *DataTable;
+ extern int DataTableSize;
+ if(bDebugCompile){
+ DataTable=(char *)HeapAlloc(hHeap,0,2);
+ DataTable[0]=2;
+ DataTable[1]=0;
+ DataTableSize=2;
+ }
+ else{
+ DataTable=(char *)HeapAlloc(hHeap,0,1);
+ DataTableSize=0;
+ }
+
+
+ //////////////////////
+ // コード生成前の準備
+ //////////////////////
+
+ //重複エラー情報管理のメモリを確保(グローバル領域コンパイル用)
+ extern char **SynonymErrorWords;
+ extern int SynonymErrorNum;
+ SynonymErrorNum=0;
+ SynonymErrorWords=(char **)HeapAlloc(hHeap,0,1);
+
+ //列挙体に関する情報の初期化
+ CEnumParent::InitEnum();
+
+ //列挙体からクラスコードを生成
+ char *temp;
+ temp=CEnumParent::GenerateCodes();
+ AddSourceCode(temp);
+ HeapDefaultFree(temp);
+
+ //関数ポインタ情報を初期化
+ extern PROCPTRINFO *pProcPtrInfo;
+ extern int ProcPtrInfoNum;
+ pProcPtrInfo=(PROCPTRINFO *)HeapAlloc(hHeap,0,1);
+ ProcPtrInfoNum=0;
+
+ //クラス名を取得(詳細情報はGetObjectClassInfoで取得)
+ // GetSubInfo関数の中で参照されるオブジェクト名を事前に取得する。
+ // ※オブジェクトの内容までは取得しない
+ pobj_DBClass=new CDBClass();
+ pobj_DBClass->InitNames();
+
+ //定数情報を取得
+ GetConstInfo();
+
+ //サブルーチン(ユーザー定義、DLL関数)の識別子、アドレスを取得
+ pobj_CompilingClass=0;
+ GetSubInfo();
+
+ //クラス情報を取得(※注 - GetSubInfoの後に呼び出す)
+ pobj_DBClass->GetObjectClassInfo();
+
+ //コードと行番号の関係
+ extern LINEINFO *pLineInfo;
+ extern int MaxLineInfoNum;
+ pLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,1);
+ MaxLineInfoNum=0;
+
+
+ ///////////////////////////
+ // 最低限必要な関数を取得
+ ///////////////////////////
+ cp=-1;
+
+ if(pSub_System_StartupProgram=GetSubHash("_System_StartupProgram",1))
+ pSub_System_StartupProgram->bUse=1;
+
+ if(pSub_DebugSys_StartProc=GetSubHash("_DebugSys_StartProc",1))
+ pSub_DebugSys_StartProc->bUse=1;
+
+ if(pSub_DebugSys_EndProc=GetSubHash("_DebugSys_EndProc",1))
+ pSub_DebugSys_EndProc->bUse=1;
+
+ if(pSub_DebugSys_SaveContext=GetSubHash("_DebugSys_SaveContext",1))
+ pSub_DebugSys_SaveContext->bUse=1;
+
+ if(pSub_System_GetEip=GetSubHash("_System_GetEip",1)){
+ pSub_System_GetEip->bUse=1;
+ pSub_System_GetEip->bSystem=1;
+ }
+
+ if(pSub_System_InitDllGlobalVariables=GetSubHash("_System_InitDllGlobalVariables",1)){
+ pSub_System_InitDllGlobalVariables->bUse=1;
+ pSub_System_InitDllGlobalVariables->bSystem=1;
+ }
+
+ if(pSub_System_InitStaticLocalVariables=GetSubHash("_System_InitStaticLocalVariables",1)){
+ pSub_System_InitStaticLocalVariables->bUse=1;
+ pSub_System_InitStaticLocalVariables->bSystem=1;
+ }
+
+ if(pSub_System_Call_Destructor_of_GlobalObject=GetSubHash("_System_Call_Destructor_of_GlobalObject",1)){
+ pSub_System_Call_Destructor_of_GlobalObject->bUse=1;
+ pSub_System_Call_Destructor_of_GlobalObject->bSystem=1;
+ }
+
+ if(pSub_System_GetSp=GetSubHash("_System_GetSp",1)){
+ pSub_System_GetSp->bUse=1;
+ pSub_System_GetSp->bSystem=1;
+ }
+
+ if(pSub_pow=GetSubHash("pow",1))
+ pSub_pow->bUse=1;
+
+ if(pSub_calloc=GetSubHash("calloc",1))
+ pSub_calloc->bUse=1;
+
+ if(pSub_realloc=GetSubHash("realloc",1))
+ pSub_realloc->bUse=1;
+
+ if(pSub_free=GetSubHash("free",1))
+ pSub_free->bUse=1;
+
+ pSub_allrem=GetSubHash("_allrem");
+ pSub_allrem->bUse=1;
+ pSub_allrem->bSystem=1;
+
+ pSub_aullrem=GetSubHash("_aullrem");
+ pSub_aullrem->bUse=1;
+ pSub_aullrem->bSystem=1;
+
+ pSub_allmul=GetSubHash("_allmul");
+ pSub_allmul->bUse=1;
+ pSub_allmul->bSystem=1;
+
+ pSub_alldiv=GetSubHash("_alldiv");
+ pSub_alldiv->bUse=1;
+ pSub_alldiv->bSystem=1;
+
+ pSub_aulldiv=GetSubHash("_aulldiv");
+ pSub_aulldiv->bUse=1;
+ pSub_aulldiv->bSystem=1;
+
+ pSub_allshl=GetSubHash("_allshl");
+ pSub_allshl->bUse=1;
+ pSub_allshl->bSystem=1;
+
+ pSub_allshr=GetSubHash("_allshr");
+ pSub_allshr->bUse=1;
+ pSub_allshr->bSystem=1;
+
+ pSub_aullshr=GetSubHash("_aullshr");
+ pSub_aullshr->bUse=1;
+ pSub_aullshr->bSystem=1;
+
+
+ //データテーブルスケジュール
+ pobj_DataTableSchedule=new CSchedule();
+ pobj_DataTableSchedule->SetFlag(SCHEDULE_FLAG_RELOC);
+
+ //インポートテーブルスケジュール
+ pobj_ImportAddrSchedule=new CImportAddrSchedule();
+ pobj_ImportAddrSchedule->SetFlag(SCHEDULE_FLAG_RELOC);
+
+ //プロシージャポインタスケジュール
+ pobj_SubAddrSchedule=new CSubAddrSchedule();
+
+ //グローバル変数アドレススケジュール
+ pobj_GlobalVarSchedule=new CSchedule();
+ pobj_GlobalVarSchedule->SetFlag(SCHEDULE_FLAG_RELOC);
+
+ //グローバル変数の初期バッファ
+ extern BYTE *initGlobalBuf;
+ initGlobalBuf=(BYTE *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+
+ //リロケーション情報
+ pobj_Reloc=new CReloc();
+
+ obp_AllocSize=8192*2;
+ OpBuffer=(char *)HeapAlloc(hHeap,0,obp_AllocSize);
+ obp=0;
+
+
+
+ //////////////////////
+ // グローバル実行領域
+ //////////////////////
+
+ cp=-1;
+ extern BOOL bCompilingGlobal;
+ bCompilingGlobal=1;
+ pobj_CompilingClass=0;
+
+ if(!bDll){
+ //ラベル用のメモリを確保
+ extern LABEL *pLabelNames;
+ extern int MaxLabelNum;
+ pLabelNames=(LABEL *)HeapAlloc(hHeap,0,1);
+ MaxLabelNum=0;
+
+ //Gotoラベルスケジュール
+ extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
+ extern int GotoLabelScheduleNum;
+ pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapAlloc(hHeap,0,1);
+ GotoLabelScheduleNum=0;
+
+ //With情報のメモリを確保
+ extern WITHINFO WithInfo;
+ WithInfo.ppName=(char **)HeapAlloc(hHeap,0,1);
+ WithInfo.pWithCp=(int *)HeapAlloc(hHeap,0,1);
+ WithInfo.num=0;
+
+ //Continueアドレスを初期化
+ extern DWORD dwContinueAddress;
+ dwContinueAddress=-1;
+
+
+ //未完成
+ //OpBuffer[obp++]=(char)0xCC;
+
+ //レキシカルスコープ情報を初期化
+ obj_LexScopes.Init(obp);
+
+ //push ebp
+ op_push(REG_EBP);
+
+ if(bDebugCompile){
+ //デバッグ用の変数を定義
+ DebugVariable();
+ }
+
+ //GC用の変数を定義
+ InitGCVariables();
+
+ //_System_StartupProgramの呼び出し
+ op_call(pSub_System_StartupProgram);
+
+ //クラスに属する静的メンバを定義
+ CMember::InitStaticMember();
+
+ //グローバル実行領域をコンパイル開始
+ CompileBuffer(0,0);
+
+ //ラベル用のメモリを解放
+ for(i=0;ibUse==0){
+ pdi=pdi->pNextData;
+ continue;
+ }
+
+ //エラーチェック
+ HINSTANCE hLib;
+ hLib=LoadLibrary(pdi->file);
+ if(!hLib){
+ extern char OutputFileName[MAX_PATH];
+ char temp2[MAX_PATH],temp3[MAX_PATH];
+ _splitpath(OutputFileName,temp2,temp3,NULL,NULL);
+ lstrcat(temp2,temp3);
+ lstrcpy(temp3,pdi->file);
+ GetFullPath(temp3,temp2);
+ hLib=LoadLibrary(temp3);
+
+ if(!hLib){
+ SetError(-106,pdi->file,pdi->pos);
+ }
+ }
+
+ if(hLib){
+ if(!GetProcAddress(hLib,pdi->alias)){
+ FreeLibrary(hLib);
+ SetError(-107,pdi->alias,pdi->pos);
+ }
+ FreeLibrary(hLib);
+ }
+
+ pdi=pdi->pNextData;
+ }
+ }
+
+
+
+ /////////////////////////////
+ // リソースデータを読み込む
+ /////////////////////////////
+ extern char ResourceFileName[MAX_PATH];
+ GetResourceData(ResourceFileName);
+
+
+ //////////////////////////////
+ // エクスポート情報(DLLのみ)
+ //////////////////////////////
+ IMAGE_EXPORT_DIRECTORY ImageExportDirectory;
+ DWORD *lpdwExportAddressTable;
+ DWORD *lpdwExportNamePointerTable;
+ WORD *lpwExportOrdinalTable;
+ char lpExportNames[8192];
+ int ExportNamesLength;
+ int ExportNum;
+ int DllMain_EntryPoint;
+
+ DllMain_EntryPoint=-1;
+ ExportNum=0;
+ ExportNamesLength=0;
+ lpdwExportAddressTable=(DWORD *)HeapAlloc(hHeap,0,1);
+ lpdwExportNamePointerTable=(DWORD *)HeapAlloc(hHeap,0,1);
+ lpwExportOrdinalTable=(WORD *)HeapAlloc(hHeap,0,1);
+
+ if(bUse_ExportSection){
+ _splitpath(OutputFileName,NULL,NULL,lpExportNames,temporary);
+ lstrcat(lpExportNames,temporary);
+ ExportNamesLength=lstrlen(lpExportNames)+1;
+
+ extern SUBINFO **ppSubHash;
+ SUBINFO *psi,*psi2;
+ while(1){
+ //辞書順にサーチ
+ temporary[0]=0;
+ for(i=0,psi2=0;ibExport){
+ if(temporary[0]=='\0'){
+ lstrcpy(temporary,psi->name);
+ psi2=psi;
+ }
+ else{
+ i3=lstrlen(temporary);
+ i4=lstrlen(psi->name);
+ if(i3name,i3)>0){
+ lstrcpy(temporary,psi->name);
+ psi2=psi;
+ }
+ }
+ }
+ psi=psi->pNextData;
+ }
+ }
+ if(psi2==0) break;
+ psi=psi2;
+
+ psi->bExport=0;
+
+ if(lstrcmpi(psi->name,"DllMain")==0)
+ DllMain_EntryPoint=psi->CompileAddress;
+
+ lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD));
+ lpdwExportAddressTable[ExportNum]=psi->CompileAddress;
+
+ lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD));
+ lpdwExportNamePointerTable[ExportNum]=ExportNamesLength;
+
+ lpwExportOrdinalTable=(WORD *)HeapReAlloc(hHeap,0,lpwExportOrdinalTable,(ExportNum+1)*sizeof(WORD));
+ lpwExportOrdinalTable[ExportNum]=ExportNum;
+
+ lstrcpy(lpExportNames+ExportNamesLength,psi->name);
+ ExportNamesLength+=lstrlen(lpExportNames+ExportNamesLength)+1;
+
+ ExportNum++;
+ }
+ for(i=0;idwType==DECLARE_STATIC||
+ pdi->bUse==0){
+ pdi=pdi->pNextData;
+ continue;
+ }
+
+ if(lstrlen(pdi->file)>16){
+ SetError(7,NULL,cp);
+ break;
+ }
+ for(i2=0;i2file)==0) break;
+ }
+ if(i2==ImportDllNum){
+ ppDllNames=(char **)HeapReAlloc(hHeap,0,ppDllNames,(ImportDllNum+1)*sizeof(char **));
+ ppDllNames[ImportDllNum]=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,16);
+ lstrcpy(ppDllNames[ImportDllNum],pdi->file);
+ ImportDllNum++;
+ }
+
+ pdi=pdi->pNextData;
+ }
+ }
+
+ //インポート テーブル、及びルックアップ テーブル サイズの計算
+ IMAGE_IMPORT_DESCRIPTOR *pImportTable;
+ int LookupSize;
+ LookupSize=0;
+ pImportTable=(IMAGE_IMPORT_DESCRIPTOR *)HeapAlloc(hHeap,0,(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR));
+ i3=(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR);
+ for(i=0;idwType==DECLARE_STATIC||
+ pdi->bUse==0){
+ pdi=pdi->pNextData;
+ continue;
+ }
+
+ if(lstrcmp(ppDllNames[i],pdi->file)==0){
+ //ルックアップデータのサイズを追加
+ LookupSize+=sizeof(DWORD);
+ }
+
+ pdi=pdi->pNextData;
+ }
+ }
+ LookupSize+=sizeof(DWORD); //NULL用
+ }
+ memset(&pImportTable[i],0,sizeof(IMAGE_IMPORT_DESCRIPTOR));
+
+ //ルックアップ テーブル、ヒント テーブル
+ DWORD *pLookupTable;
+ pLookupTable=(DWORD *)HeapAlloc(hHeap,0,LookupSize*sizeof(DWORD)+1);
+ char *pHintTable;
+ int HintSize,HintAllocSize;
+ HintSize=0;
+ HintAllocSize=128*2;
+ pHintTable=(char *)HeapAlloc(hHeap,0,HintAllocSize);
+ i3+=ImportDllNum*0x10;
+ for(i=0,i5=0;idwType==DECLARE_STATIC||
+ pdi->bUse==0){
+ pdi=pdi->pNextData;
+ continue;
+ }
+
+ if(lstrcmp(ppDllNames[i],pdi->file)==0){
+ //ルックアップの位置をセット(後にインポート アドレス テーブルにセットしなおされる)
+ pdi->LookupAddress=i3+(i5*sizeof(DWORD));
+
+ //ルックアップ テーブル
+ pLookupTable[i5++]=i3+LookupSize+HintSize;
+
+ //ヒント テーブル
+ pHintTable[HintSize++]=0;
+ pHintTable[HintSize++]=0;
+ lstrcpy(pHintTable+HintSize,pdi->alias);
+ i4=lstrlen(pdi->alias);
+ HintSize+=i4+1;
+ if(i4%2==0) pHintTable[HintSize++]=0;
+
+ if(HintAllocSizepNextData;
+ }
+ }
+ pLookupTable[i5++]=0;
+ }
+
+
+ if(bDll){
+ //DLLの場合はリロケーション情報を仮生成
+ //※正式な生成は各セクションのメモリ上のサイズが決定してから再度行う。
+ pobj_Reloc->ResetRelocBuffer();
+ }
+
+
+
+ //グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
+ //(デバッグ情報で利用される)
+ extern int MaxGlobalVarNum;
+ extern VARIABLE *GlobalVar;
+ extern int AllInitGlobalVarSize;
+ for(i=0;imake();
+ }
+
+
+
+ /////////////////////////////////////
+ // 各セクションの位置とサイズを計算
+ /////////////////////////////////////
+
+ //コードセッションのファイル上のサイズ
+ if(obp%FILE_ALIGNMENT) FileSize_CodeSection=obp+(FILE_ALIGNMENT-obp%FILE_ALIGNMENT);
+ else FileSize_CodeSection=obp;
+ if(FileSize_CodeSection) bUse_CodeSection=1;
+ else bUse_CodeSection=0;
+
+ //エクスポートセクションのファイル上のサイズ
+ i= sizeof(IMAGE_EXPORT_DIRECTORY)+ //エクスポートディレクトリテーブルを飛び越す
+ ExportNum*sizeof(DWORD)+ //エクスポート アドレス テーブルを飛び越す
+ ExportNum*sizeof(DWORD)+ //エクスポート名ポインタ テーブルを飛び越す
+ ExportNum*sizeof(WORD)+ //エクスポート序数テーブルを飛び越す
+ ExportNamesLength; //シンボル名バッファ
+ if(bUse_ExportSection){
+ if(i%FILE_ALIGNMENT) FileSize_ExportSection=i+(FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+ else FileSize_ExportSection=i;
+ }
+ else FileSize_ExportSection=0;
+
+ //インポートセクションのファイル上のサイズ
+ i=(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+
+ 16*ImportDllNum+ //DLL名
+ LookupSize+ //ルックアップテーブル
+ HintSize+ //ヒント名(関数名)テーブル
+ LookupSize; //インポート アドレス テーブル
+ if(i%FILE_ALIGNMENT) FileSize_ImportSection=i+(FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+ else FileSize_ImportSection=i;
+ bUse_ImportSection=1; //インポートセクションは必ず存在する
+
+ //データセクションのファイル上のサイズ
+ if(DataTableSize%FILE_ALIGNMENT) FileSize_DataSection=DataTableSize+(FILE_ALIGNMENT-DataTableSize%FILE_ALIGNMENT);
+ else FileSize_DataSection=DataTableSize;
+ if(FileSize_DataSection) bUse_DataSection=1;
+ else bUse_DataSection=0;
+
+ //リライタブルセクションのファイル上のサイズ(グローバル変数の初期情報のみを格納)
+ if(AllInitGlobalVarSize%FILE_ALIGNMENT) FileSize_RWSection=AllInitGlobalVarSize+(FILE_ALIGNMENT-AllInitGlobalVarSize%FILE_ALIGNMENT);
+ else{
+ if(AllInitGlobalVarSize) FileSize_RWSection=AllInitGlobalVarSize;
+ else FileSize_RWSection=FILE_ALIGNMENT;
+ }
+ bUse_RWSection=1;
+
+ //リソースセクションのファイル上のサイズ
+ char *RSrcSectionBuffer;
+ int RSrcSectionSize;
+ RSrcSectionBuffer=GetRSrcSectionBuffer(&RSrcSectionSize);
+ if(RSrcSectionSize%FILE_ALIGNMENT) FileSize_RSrcSection=RSrcSectionSize+(FILE_ALIGNMENT-RSrcSectionSize%FILE_ALIGNMENT);
+ else FileSize_RSrcSection=RSrcSectionSize;
+ if(FileSize_RSrcSection) bUse_RSrcSection=1;
+ else bUse_RSrcSection=0;
+
+ //リロケーションセクションのファイル上のサイズ
+ if(pobj_Reloc->length%FILE_ALIGNMENT) FileSize_RelocSection=pobj_Reloc->length+(FILE_ALIGNMENT-pobj_Reloc->length%FILE_ALIGNMENT);
+ else FileSize_RelocSection=pobj_Reloc->length;
+ if(FileSize_RelocSection) bUse_RelocSection=1;
+ else bUse_RelocSection=0;
+
+ //デバッグセクションのファイル上のサイズ
+ if(pobj_DebugSection->length%FILE_ALIGNMENT) FileSize_DebugSection=pobj_DebugSection->length+(FILE_ALIGNMENT-pobj_DebugSection->length%FILE_ALIGNMENT);
+ else FileSize_DebugSection=pobj_DebugSection->length;
+ if(FileSize_DebugSection) bUse_DebugSection=1;
+ else bUse_DebugSection=0;
+
+
+ //各セッションのファイル上の位置
+ FilePos_CodeSection= EXE_HEADER_SIZE;
+ FilePos_ExportSection= FilePos_CodeSection+
+ FileSize_CodeSection;
+ FilePos_ImportSection= FilePos_ExportSection+
+ FileSize_ExportSection;
+ FilePos_DataSection= FilePos_ImportSection+
+ FileSize_ImportSection;
+ FilePos_RWSection= FilePos_DataSection+
+ FileSize_DataSection;
+ FilePos_RSrcSection= FilePos_RWSection+
+ FileSize_RWSection;
+ FilePos_RelocSection= FilePos_RSrcSection+
+ FileSize_RSrcSection;
+ FilePos_DebugSection= FilePos_RelocSection+
+ FileSize_RelocSection;
+
+
+ //コードセッションのメモリ上のサイズ
+ if(FileSize_CodeSection%MEM_ALIGNMENT) MemSize_CodeSection=FileSize_CodeSection+(MEM_ALIGNMENT-FileSize_CodeSection%MEM_ALIGNMENT);
+ else MemSize_CodeSection=FileSize_CodeSection;
+
+ //エクスポートセクションのメモリ上のサイズ
+ if(FileSize_ExportSection%MEM_ALIGNMENT) MemSize_ExportSection=FileSize_ExportSection+(MEM_ALIGNMENT-FileSize_ExportSection%MEM_ALIGNMENT);
+ else MemSize_ExportSection=FileSize_ExportSection;
+
+ //インポートセクションのメモリ上のサイズ
+ if(FileSize_ImportSection%MEM_ALIGNMENT) MemSize_ImportSection=FileSize_ImportSection+(MEM_ALIGNMENT-FileSize_ImportSection%MEM_ALIGNMENT);
+ else MemSize_ImportSection=FileSize_ImportSection;
+
+ //データセクションのメモリ上のサイズ
+ if(FileSize_DataSection%MEM_ALIGNMENT) MemSize_DataSection=FileSize_DataSection+(MEM_ALIGNMENT-FileSize_DataSection%MEM_ALIGNMENT);
+ else MemSize_DataSection=FileSize_DataSection;
+
+ //リライタブルセクションのメモリ上のサイズ
+ extern int AllGlobalVarSize;
+ i=AllInitGlobalVarSize+AllGlobalVarSize;
+ if(i%MEM_ALIGNMENT) MemSize_RWSection=i+(MEM_ALIGNMENT-i%MEM_ALIGNMENT);
+ else MemSize_RWSection=i;
+
+ //リソースセクションのメモリ上のサイズ
+ if(FileSize_RSrcSection%MEM_ALIGNMENT) MemSize_RSrcSection=FileSize_RSrcSection+(MEM_ALIGNMENT-FileSize_RSrcSection%MEM_ALIGNMENT);
+ else MemSize_RSrcSection=FileSize_RSrcSection;
+
+ //リロケーションセクションのメモリ上のサイズ
+ if(FileSize_RelocSection%MEM_ALIGNMENT) MemSize_RelocSection=FileSize_RelocSection+(MEM_ALIGNMENT-FileSize_RelocSection%MEM_ALIGNMENT);
+ else MemSize_RelocSection=FileSize_RelocSection;
+
+ //デバッグセクションのメモリ上のサイズ
+ if(FileSize_DebugSection%MEM_ALIGNMENT) MemSize_DebugSection=FileSize_DebugSection+(MEM_ALIGNMENT-FileSize_DebugSection%MEM_ALIGNMENT);
+ else MemSize_DebugSection=FileSize_DebugSection;
+
+
+ //各セッションのメモリ上の位置
+ if(bUse_ExportSection) MemPos_ExportSection= 0x1000+
+ MemSize_CodeSection;
+ else MemPos_ExportSection=0;
+ if(bUse_ImportSection) MemPos_ImportSection= 0x1000+
+ MemSize_CodeSection+
+ MemSize_ExportSection;
+ else MemPos_ImportSection=0;
+ if(bUse_DataSection) MemPos_DataSection= 0x1000+
+ MemSize_CodeSection+
+ MemSize_ExportSection+
+ MemSize_ImportSection;
+ else MemPos_DataSection=0;
+ if(bUse_RWSection) MemPos_RWSection= 0x1000+
+ MemSize_CodeSection+
+ MemSize_ExportSection+
+ MemSize_ImportSection+
+ MemSize_DataSection;
+ else MemPos_RWSection=0;
+ if(bUse_RSrcSection) MemPos_RSrcSection= 0x1000+
+ MemSize_CodeSection+
+ MemSize_ExportSection+
+ MemSize_ImportSection+
+ MemSize_DataSection+
+ MemSize_RWSection;
+ else MemPos_RSrcSection=0;
+ if(bUse_RelocSection) MemPos_RelocSection= 0x1000+
+ MemSize_CodeSection+
+ MemSize_ExportSection+
+ MemSize_ImportSection+
+ MemSize_DataSection+
+ MemSize_RWSection+
+ MemSize_RSrcSection;
+ else MemPos_RelocSection=0;
+ if(bUse_DebugSection) MemPos_DebugSection= 0x1000+
+ MemSize_CodeSection+
+ MemSize_ExportSection+
+ MemSize_ImportSection+
+ MemSize_DataSection+
+ MemSize_RWSection+
+ MemSize_RSrcSection+
+ MemSize_RelocSection;
+ else MemPos_DebugSection=0;
+
+
+
+ /////////////////////////////
+ // GC用の変数スケジュール
+ /////////////////////////////
+ PerformedGcVarSchedule();
+
+
+
+ ////////////////////////////
+ // エクスポート情報の再配置
+ ////////////////////////////
+ if(bUse_ExportSection){
+ for(i=0;ibUse==0){
+ pdi=pdi->pNextData;
+ continue;
+ }
+
+ if(lstrcmp(ppDllNames[i],pdi->file)==0){
+ //ルックアップ テーブル
+ pLookupTable[i5++]+=MemPos_ImportSection;
+ }
+
+ pdi=pdi->pNextData;
+ }
+ }
+ i5++;
+ }
+
+
+ ////////////////////////////////////////
+ //仮想関数データテーブルスケジュール
+ pobj_DBClass->ActionVtblSchedule(ImageBase,MemPos_CodeSection);
+
+
+ //////////////////////////////
+ // データテーブルスケジュール
+ for(i=0;inum;i++){
+ *((long *)(OpBuffer+pobj_DataTableSchedule->pObpValues[i]))+=ImageBase+MemPos_DataSection;
+ }
+ delete pobj_DataTableSchedule;
+
+
+ //////////////////////////////////
+ // インポートテーブルスケジュール(インポート アドレス テーブルを指し示させる)
+ for(i=0;inum;i++){
+ DECLAREINFO *pdi;
+ pdi=pobj_ImportAddrSchedule->ppdi[i];
+ *((long *)(OpBuffer+pobj_ImportAddrSchedule->pObpValues[i]))=
+ ImageBase+
+ MemPos_ImportSection+
+ LookupSize+ //ルックアップテーブル
+ HintSize+ //ヒント名(関数名)テーブル
+ pdi->LookupAddress;
+ }
+ delete pobj_ImportAddrSchedule;
+
+
+ ////////////////////////////////////
+ // プロシージャポインタスケジュール
+ for(i=0;inum;i++){
+ if(pobj_SubAddrSchedule->pbCall[i]){
+ *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
+ pobj_SubAddrSchedule->ppsi[i]->CompileAddress-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));
+ }
+ else{
+ *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
+ pobj_SubAddrSchedule->ppsi[i]->CompileAddress+ImageBase+MemPos_CodeSection;
+ }
+ }
+ delete pobj_SubAddrSchedule;
+
+
+ if(bDll){
+ //DLLの場合はリロケーション情報を生成
+ pobj_Reloc->ResetRelocBuffer();
+ }
+
+
+
+ //////////////////////////////////////
+ // グローバル変数アドレススケジュール
+ //////////////////////////////////////
+
+ /*
+ GlobalArea1 - 初期バッファあり
+ GlobalArea2 - 初期バッファなし
+ */
+ for(i=0;inum;i++){
+ if(*((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i])) & 0x80000000){
+ //初期バッファなし
+ *((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i]))=
+ AllInitGlobalVarSize+
+ (*((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i])) & 0x7FFFFFFF)+
+ ImageBase+MemPos_RWSection;
+ }
+ else{
+ //初期バッファあり
+ *((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i]))+=
+ ImageBase+MemPos_RWSection;
+ }
+ }
+ delete pobj_GlobalVarSchedule;
+
+
+
+ ////////////////////////////////
+ // リソースアドレススケジュール
+ extern DWORD *lpdwRSrcAddrSchedule;
+ extern int RSrcAddrScheduleNum;
+ for(i=0;ilength;
+ ImagePeHdr.OptionalHeader.DataDirectory[6].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[6].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[7].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[7].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[8].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[8].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[9].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[9].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[10].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[10].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[11].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[11].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[12].VirtualAddress=MemPos_ImportSection+
+ (ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+
+ 16*ImportDllNum+ //DLL名
+ LookupSize+ //ルックアップテーブル
+ HintSize; //ヒント名(関数名)テーブル
+ ImagePeHdr.OptionalHeader.DataDirectory[12].Size=LookupSize;
+ ImagePeHdr.OptionalHeader.DataDirectory[13].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[13].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[14].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[14].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[15].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[15].Size=0;
+
+
+ //コードセクションヘッダ
+ IMAGE_SECTION_HEADER CodeSectionHeader;
+ memset((char *)CodeSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)CodeSectionHeader.Name,".text");
+ CodeSectionHeader.Misc.VirtualSize= MemSize_CodeSection;
+ CodeSectionHeader.VirtualAddress= MemPos_CodeSection; //開始アドレス
+ CodeSectionHeader.SizeOfRawData= FileSize_CodeSection;
+ CodeSectionHeader.PointerToRawData= FilePos_CodeSection; //ファイル上の開始アドレス
+ CodeSectionHeader.PointerToRelocations= 0;
+ CodeSectionHeader.PointerToLinenumbers= 0;
+ CodeSectionHeader.NumberOfRelocations= 0;
+ CodeSectionHeader.NumberOfLinenumbers= 0;
+ CodeSectionHeader.Characteristics= IMAGE_SCN_MEM_EXECUTE|
+ IMAGE_SCN_MEM_READ|
+ IMAGE_SCN_CNT_CODE;
+
+ //エクスポートセクションヘッダ
+ IMAGE_SECTION_HEADER ExportSectionHeader;
+ memset((char *)ExportSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)ExportSectionHeader.Name,".edata");
+ ExportSectionHeader.Misc.VirtualSize= MemSize_ExportSection;
+ ExportSectionHeader.VirtualAddress= MemPos_ExportSection; //開始アドレス
+ ExportSectionHeader.SizeOfRawData= FileSize_ExportSection; //サイズ
+ ExportSectionHeader.PointerToRawData= FilePos_ExportSection; //ファイル上の開始アドレス
+ ExportSectionHeader.PointerToRelocations= 0;
+ ExportSectionHeader.PointerToLinenumbers= 0;
+ ExportSectionHeader.NumberOfRelocations= 0;
+ ExportSectionHeader.NumberOfLinenumbers= 0;
+ ExportSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
+ IMAGE_SCN_MEM_READ;
+
+ //インポートセクションヘッダ
+ IMAGE_SECTION_HEADER ImportSectionHeader;
+ memset((char *)ImportSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)ImportSectionHeader.Name,".idata");
+ ImportSectionHeader.Misc.VirtualSize= MemSize_ImportSection;
+ ImportSectionHeader.VirtualAddress= MemPos_ImportSection; //開始アドレス
+ ImportSectionHeader.SizeOfRawData= FileSize_ImportSection; //サイズ
+ ImportSectionHeader.PointerToRawData= FilePos_ImportSection; //ファイル上の開始アドレス
+ ImportSectionHeader.PointerToRelocations= 0;
+ ImportSectionHeader.PointerToLinenumbers= 0;
+ ImportSectionHeader.NumberOfRelocations= 0;
+ ImportSectionHeader.NumberOfLinenumbers= 0;
+ ImportSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
+ IMAGE_SCN_MEM_READ;
+
+ //データセクションヘッダ
+ IMAGE_SECTION_HEADER DataSectionHeader;
+ memset((char *)DataSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)DataSectionHeader.Name,".sdata");
+ DataSectionHeader.Misc.VirtualSize= MemSize_DataSection;
+ DataSectionHeader.VirtualAddress= MemPos_DataSection;
+ DataSectionHeader.SizeOfRawData= FileSize_DataSection;
+ DataSectionHeader.PointerToRawData= FilePos_DataSection;
+ DataSectionHeader.PointerToRelocations= 0;
+ DataSectionHeader.PointerToLinenumbers= 0;
+ DataSectionHeader.NumberOfRelocations= 0;
+ DataSectionHeader.NumberOfLinenumbers= 0;
+ DataSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
+ IMAGE_SCN_MEM_READ|
+ IMAGE_SCN_MEM_WRITE;
+
+ //リライタブルセクションヘッダ
+ IMAGE_SECTION_HEADER RWSectionHeader;
+ memset((char *)RWSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)RWSectionHeader.Name,".data");
+ RWSectionHeader.Misc.VirtualSize= AllInitGlobalVarSize+AllGlobalVarSize;
+ RWSectionHeader.VirtualAddress= MemPos_RWSection;
+ RWSectionHeader.SizeOfRawData= FileSize_RWSection;
+ RWSectionHeader.PointerToRawData= FilePos_RWSection;
+ RWSectionHeader.PointerToRelocations= 0;
+ RWSectionHeader.PointerToLinenumbers= 0;
+ RWSectionHeader.NumberOfRelocations= 0;
+ RWSectionHeader.NumberOfLinenumbers= 0;
+ RWSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
+ IMAGE_SCN_MEM_READ|
+ IMAGE_SCN_MEM_WRITE;
+
+ //リソースセクションヘッダ
+ IMAGE_SECTION_HEADER RSrcSectionHeader;
+ memset((char *)RSrcSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)RSrcSectionHeader.Name,".rsrc");
+ RSrcSectionHeader.Misc.VirtualSize= RSrcSectionSize;
+ RSrcSectionHeader.VirtualAddress= MemPos_RSrcSection;
+ RSrcSectionHeader.SizeOfRawData= FileSize_RSrcSection;
+ RSrcSectionHeader.PointerToRawData= FilePos_RSrcSection;
+ RSrcSectionHeader.PointerToRelocations= 0;
+ RSrcSectionHeader.PointerToLinenumbers= 0;
+ RSrcSectionHeader.NumberOfRelocations= 0;
+ RSrcSectionHeader.NumberOfLinenumbers= 0;
+ RSrcSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
+ IMAGE_SCN_MEM_READ;
+
+ //リロケーションセクションヘッダ
+ IMAGE_SECTION_HEADER RelocSectionHeader;
+ memset((char *)RelocSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)RelocSectionHeader.Name,".reloc");
+ RelocSectionHeader.Misc.VirtualSize= pobj_Reloc->length;
+ RelocSectionHeader.VirtualAddress= MemPos_RelocSection; //開始アドレス
+ RelocSectionHeader.SizeOfRawData= FileSize_RelocSection; //サイズ
+ RelocSectionHeader.PointerToRawData= FilePos_RelocSection; //ファイル上の開始アドレス
+ RelocSectionHeader.PointerToRelocations= 0;
+ RelocSectionHeader.PointerToLinenumbers= 0;
+ RelocSectionHeader.NumberOfRelocations= 0;
+ RelocSectionHeader.NumberOfLinenumbers= 0;
+ RelocSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
+ IMAGE_SCN_MEM_DISCARDABLE|
+ IMAGE_SCN_MEM_READ;
+
+ //デバッグセクションヘッダ
+ IMAGE_SECTION_HEADER DebugSectionHeader;
+ memset((char *)DebugSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)DebugSectionHeader.Name,".debug");
+ DebugSectionHeader.Misc.VirtualSize= pobj_DebugSection->length;
+ DebugSectionHeader.VirtualAddress= MemPos_DebugSection; //開始アドレス
+ DebugSectionHeader.SizeOfRawData= FileSize_DebugSection; //サイズ
+ DebugSectionHeader.PointerToRawData= FilePos_DebugSection; //ファイル上の開始アドレス
+ DebugSectionHeader.PointerToRelocations= 0;
+ DebugSectionHeader.PointerToLinenumbers= 0;
+ DebugSectionHeader.NumberOfRelocations= 0;
+ DebugSectionHeader.NumberOfLinenumbers= 0;
+ DebugSectionHeader.Characteristics= IMAGE_SCN_MEM_DISCARDABLE|
+ IMAGE_SCN_MEM_READ;
+
+
+ hFile=CreateFile(OutputFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
+ if(hFile==INVALID_HANDLE_VALUE){
+ SetError(53,OutputFileName,-1);
+ goto EndWriteOpcode;
+ }
+
+ //ヘッダ
+ WriteFile(hFile,(void *)&ImageDosHeader,sizeof(IMAGE_DOS_HEADER),(DWORD *)&i2,NULL);
+ i=i2;
+
+ //Dosスタブ
+ WriteFile(hFile,DosStubBuffer,DosStubSize,(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //0x0100までNULLを並べる
+ temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,0x0100-i);
+ WriteFile(hFile,temp2,0x0100-i,(DWORD *)&i2,NULL);
+ HeapDefaultFree(temp2);
+ i+=i2;
+
+ //PEヘッダ
+ WriteFile(hFile,&ImagePeHdr,sizeof(IMAGE_NT_HEADERS),(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //コード セクション ヘッダ
+ WriteFile(hFile,&CodeSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+
+ if(bUse_ExportSection){
+ //エクスポート セクション ヘッダ
+ WriteFile(hFile,&ExportSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+ if(bUse_ImportSection){
+ //インポート セクション ヘッダ
+ WriteFile(hFile,&ImportSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+ if(bUse_DataSection){
+ //データ セクション ヘッダ
+ WriteFile(hFile,&DataSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+ if(bUse_RWSection){
+ //リライタブルセクションヘッダ
+ WriteFile(hFile,&RWSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+ if(bUse_RSrcSection){
+ //リソースセクションヘッダ
+ WriteFile(hFile,&RSrcSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+ if(bUse_RelocSection){
+ //リロケーションセクションヘッダ
+ WriteFile(hFile,&RelocSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+ if(bUse_DebugSection){
+ //デバッグセクションヘッダ
+ WriteFile(hFile,&DebugSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+
+ //EXE_HEADER_SIZEまでNULLを並べる
+ temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,EXE_HEADER_SIZE-i);
+ WriteFile(hFile,temp2,EXE_HEADER_SIZE-i,(DWORD *)&i2,NULL);
+ HeapDefaultFree(temp2);
+ i+=i2;
+
+ //コード
+ WriteFile(hFile,OpBuffer,obp,(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //FilePos_ExportSectionまでNULLを並べる
+ temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_ExportSection-i);
+ WriteFile(hFile,temp2,FilePos_ExportSection-i,(DWORD *)&i2,NULL);
+ HeapDefaultFree(temp2);
+ i+=i2;
+
+ if(bUse_ExportSection){
+ //エクスポート ディレクトリ テーブル
+ WriteFile(hFile,&ImageExportDirectory,sizeof(IMAGE_EXPORT_DIRECTORY),(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //エクスポート アドレス テーブル
+ WriteFile(hFile,lpdwExportAddressTable,ExportNum*sizeof(DWORD),(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //エクスポート名ポインタ テーブル
+ WriteFile(hFile,lpdwExportNamePointerTable,ExportNum*sizeof(DWORD),(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //エクスポート序数テーブル
+ WriteFile(hFile,lpwExportOrdinalTable,ExportNum*sizeof(WORD),(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //シンボル名
+ WriteFile(hFile,lpExportNames,ExportNamesLength,(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+
+ //FilePos_ImportSectionまでNULLを並べる
+ temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_ImportSection-i);
+ WriteFile(hFile,temp2,FilePos_ImportSection-i,(DWORD *)&i2,NULL);
+ HeapDefaultFree(temp2);
+ i+=i2;
+
+ if(bUse_ImportSection){
+ //インポート ディレクトリ テーブル(Nullディレクトリ テーブルを含む)
+ for(i3=0;i3<(ImportDllNum+1);i3++){
+ WriteFile(hFile,&pImportTable[i3],sizeof(IMAGE_IMPORT_DESCRIPTOR),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+
+ //DLL名
+ for(i3=0;i3buffer,pobj_Reloc->length,(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+
+ //ファイルアラインメントを考慮
+ if(i%FILE_ALIGNMENT){
+ temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+ WriteFile(hFile,temp2,FILE_ALIGNMENT-i%FILE_ALIGNMENT,(DWORD *)&i2,NULL);
+ HeapDefaultFree(temp2);
+ i+=i2;
+ }
+
+ if(bUse_DebugSection){
+ //デバッグセクション
+ WriteFile(hFile,pobj_DebugSection->buffer,pobj_DebugSection->length,(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+
+ //ファイルアラインメントを考慮
+ if(i%FILE_ALIGNMENT){
+ temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+ WriteFile(hFile,temp2,FILE_ALIGNMENT-i%FILE_ALIGNMENT,(DWORD *)&i2,NULL);
+ HeapDefaultFree(temp2);
+ i+=i2;
+ }
+
+ //書き込み終了
+ CloseHandle(hFile);
+
+
+EndWriteOpcode:
+
+ //Dosスタブ用のメモリを解放
+ HeapDefaultFree(DosStubBuffer);
+
+ //エクスポート テーブル情報を解放
+ HeapDefaultFree(lpdwExportAddressTable);
+ HeapDefaultFree(lpdwExportNamePointerTable);
+ HeapDefaultFree(lpwExportOrdinalTable);
+
+ //インポートDLL情報を解放
+ HeapDefaultFree(pImportTable);
+ for(i=0;ippobj_Method[pobj_StringClass->ConstructorMemberSubIndex]->psi);
+ }
+
+ int i2;
+ i2=AddDataTable(lpszText,lstrlen(lpszText));
+
+ //push lpszPtr
+ OpBuffer[obp++]=(char)0x68;
+ *((long *)(OpBuffer+obp))=i2;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+
+
+ SetObjectVariable((LONG_PTR)pobj_StringClass,DEF_PTR_BYTE,-1,0);
+}
+
+
+int NumOpe(char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap){
+ extern HANDLE hHeap;
+ int i,i2,i3,i4;
+ char temporary[8192],temp2[1024],temp3[1024];
+
+ if(Command[0]=='\0'){
+ SetError(1,NULL,cp);
+ return -1;
+ }
+
+ if(Command[0]==1&&Command[1]==ESC_NEW){
+ //New演算子(オブジェクト生成)
+ return Operator_New(Command+2,plpIndex);
+ }
+
+
+ /////////////////////////////////
+ // 式要素を逆ポーランド式で取得
+ /////////////////////////////////
+
+ char *values[255];
+ long calc[255];
+ long stack[255];
+ int pnum;
+ if(!GetNumOpeElements(Command,&pnum,values,calc,stack)){
+ for(i=0;inum;
+
+ //リテラル演算の場合を考慮した演算前のデータテーブルスケジュール位置
+ int Before_DataTableScheduleNum;
+ Before_DataTableScheduleNum=pobj_DataTableSchedule->num;
+
+ //リテラル演算の場合を考慮した演算前の再配置スケジュール
+ CReloc *pobj_BackReloc;
+ pobj_BackReloc=new CReloc();
+ pobj_BackReloc->copy(pobj_Reloc);
+
+ double dbl;
+ int sp;
+ int type[255];
+ LONG_PTR index_stack[255];
+ BOOL bUseHeap[255];
+ _int64 i64data;
+ for(i=0,sp=0;iadd();
+ obp+=sizeof(long);
+ }
+ else if((term[0]=='e'||term[0]=='E')&&
+ (term[1]=='x'||term[1]=='X')&&
+ term[2]=='\"'){
+ //拡張版リテラル文字列(エスケープシーケンス可能)
+ if(!RemoveStringQuotes(term+2)){
+ SetError(43,NULL,cp);
+ goto error;
+ }
+ i3=FormatString_EscapeSequence(term+2);
+ term+=2;
+
+ goto StrLiteral;
+ }
+ else if(IsVariableTopChar(term[0])||
+ term[0]=='*'||
+ (term[0]=='.'&&IsVariableTopChar(term[1]))){
+ //////////////////
+ // 何らかの識別子
+
+ //////////////////////////////////////
+ // 関数(DLL、ユーザー定義、組み込み)
+ //////////////////////////////////////
+
+ i2=GetCallProcName(term,temporary);
+ if(term[i2]=='('){
+ i4=GetStringInPare_RemovePare(temp2,term+i2+1);
+
+ int idProc;
+ void *pInfo;
+ idProc=GetProc(temporary,&pInfo);
+
+ if(idProc){
+ //閉じカッコ")"に続く文字がNULLでないときはエラーにする
+ if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
+
+ ////////////////
+ // 呼び出し
+ ////////////////
+
+ i2=CallProc(idProc,pInfo,temporary,temp2,&index_stack[sp]);
+ if(i2==-1){
+ //戻り値が存在しないとき
+ for(i2=2;;i2++){
+ if(term[i2]=='('||term[i2]=='\0'){
+ term[i2]=0;
+ break;
+ }
+ }
+ SetError(38,term,cp);
+
+ goto error;
+ }
+
+
+ /////////////////////
+ // 戻り値の処理
+ /////////////////////
+
+ //大きな型への暗黙の変換
+ type[sp]=AutoBigCast(BaseType,i2);
+ bLiteralCalculation=0;
+
+ //スタックへプッシュ
+ PushReturnValue(i2);
+
+ if(Is64Type(type[sp])&&IsWholeNumberType(i2)&&GetTypeSize(i2,-1)<=sizeof(long)){
+ //必要に応じて64ビット拡張
+ ExtendStackTo64(i2);
+ }
+
+ if(i2==DEF_OBJECT){
+ //Object型が戻ったときはヒープ領域にインスタンスが格納されている
+ //※後にfreeする必要あり
+ bUseHeap[sp]=1;
+ }
+
+ sp++;
+ break;
+ }
+ else if(GetConstCalcBuffer(temporary,temp2,temp3)){
+ /////////////////////////
+ // マクロ関数
+ /////////////////////////
+
+ //閉じカッコ")"に続く文字がNULLでないときはエラーにする
+ if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
+
+ //マクロ関数の場合
+ type[sp]=NumOpe(temp3,0,0,&index_stack[sp]);
+
+ if(!IS_LITERAL(index_stack[sp])){
+ //リテラル値ではなかったとき
+ bLiteralCalculation=0;
+ }
+
+ sp++;
+ break;
+ }
+ }
+
+
+
+ char variable[VN_SIZE],array_element[VN_SIZE];
+ CClass *pobj_c;
+ GetArrayElement(term,variable,array_element);
+ if(array_element[0]){
+ i2=GetVarType(variable,(LONG_PTR *)&pobj_c,0);
+ if(i2==DEF_OBJECT){
+ TYPEINFO RetTypeInfo;
+ CallArrayOperatorProc(pobj_c,variable,array_element,RetTypeInfo);
+ type[sp]=RetTypeInfo.type;
+ index_stack[sp]=RetTypeInfo.u.lpIndex;
+ bLiteralCalculation=0;
+
+ //push eax
+ op_push(REG_EAX);
+
+ sp++;
+ break;
+ }
+ }
+
+
+
+ RELATIVE_VAR RelativeVar;
+ if(GetVarOffset(0,term,&i2,&RelativeVar,&index_stack[sp])){
+ //////////
+ // 変数
+ //////////
+
+ //大きな型への暗黙の変換
+ type[sp]=AutoBigCast(BaseType,i2);
+ bLiteralCalculation=0;
+
+ if(i2&FLAG_PTR){
+ //配列ポインタ
+ type[sp]=GetPtrType(i2^FLAG_PTR,index_stack[sp]);
+
+ SetVarPtrToEax(&RelativeVar);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else if(i2==DEF_DOUBLE||
+ i2==DEF_INT64||
+ i2==DEF_QWORD){
+ //64ビット型
+ PushDoubleVariable(&RelativeVar);
+ }
+ else if(i2==DEF_LONG||i2==DEF_DWORD||i2==DEF_SINGLE||
+ IsPtrType(i2)){
+ //32ビット型
+ PushLongVariable(&RelativeVar);
+ }
+ else if(i2==DEF_INTEGER){
+ PushIntegerVariable(&RelativeVar);
+ }
+ else if(i2==DEF_WORD){
+ PushWordVariable(&RelativeVar);
+ }
+ else if(i2==DEF_CHAR){
+ PushCharVariable(&RelativeVar);
+ }
+ else if(i2==DEF_BYTE){
+ PushByteVariable(&RelativeVar);
+ }
+ else if(i2==DEF_OBJECT){
+ //オブジェクト ポインタをeaxへ格納
+ SetVarPtrToEax(&RelativeVar);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+
+ if(Is64Type(type[sp])&&IsWholeNumberType(i2)&&GetTypeSize(i2,-1)<=sizeof(long)){
+ //必要に応じて64ビット拡張
+ ExtendStackTo64(i2);
+ }
+
+ sp++;
+ break;
+ }
+
+
+ //////////////
+ // 定数の場合
+ //////////////
+
+ i3=GetConstValue(term,&dbl,temporary,&index_stack[sp]);
+ if(i3!=-1){
+ type[sp]=i3;
+ if(IsRealNumberType(i3)){
+ //実数
+ memcpy(&i64data,&dbl,sizeof(double));
+ goto Literal;
+ }
+ else if(IsWholeNumberType(i3)){
+ //整数
+ i64data=(_int64)dbl;
+ goto Literal;
+ }
+ else if(Is64Type(i3)){
+ //64ビット整数値
+ memcpy(&i64data,&dbl,sizeof(_int64));
+ goto Literal;
+ }
+ else if(i3==DEF_STRING){
+ //リテラル文字列
+
+ //バイト数
+ i3=(int)dbl;
+
+ memcpy(term,temporary,i3);
+ goto StrLiteral;
+ }
+ else{
+ SetError(300,NULL,cp);
+ goto error;
+ }
+ }
+
+
+ //////////////
+ // 型名の場合
+ //////////////
+
+ LONG_PTR lp;
+ i3=GetTypeFixed(term,&lp);
+ if(i3!=-1){
+ type[sp]=i3|FLAG_CAST;
+ index_stack[sp]=lp;
+ sp++;
+ break;
+ }
+
+
+
+ /////////////////////////////////
+ // プロパティ用のメソッド
+ /////////////////////////////////
+
+ //配列要素を排除
+ char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+ GetArrayElement(term,VarName,ArrayElements);
+
+ if(GetSubHash(VarName,0)){
+ TYPEINFO RetTypeInfo;
+ CallPropertyMethod(term,NULL,&RetTypeInfo);
+
+ //大きな型への暗黙の変換
+ type[sp]=AutoBigCast(BaseType,RetTypeInfo.type);
+
+ index_stack[sp]=RetTypeInfo.u.lpIndex;
+ bLiteralCalculation=0;
+
+ //スタックへプッシュ
+ PushReturnValue(RetTypeInfo.type);
+
+ if(type[sp]==DEF_OBJECT){
+ //Object型が戻ったときはヒープ領域にインスタンスが格納されている
+ //※後にfreeする必要あり
+ bUseHeap[sp]=1;
+ }
+
+ sp++;
+ break;
+ }
+
+
+
+ //該当する識別子が見当たらないときはエラー扱いにする
+ bError=1;
+ SetError(3,term,cp);
+ type[sp]=DEF_DOUBLE;
+ }
+ else{
+ //リテラル値
+ type[sp]=GetLiteralValue(term,&i64data,BaseType);
+Literal:
+ if(type[sp]==DEF_INT64||
+ type[sp]==DEF_QWORD||
+ type[sp]==DEF_DOUBLE){
+ //64ビット(符号有り整数/実数)
+
+ //push HILONG(dbl)
+ op_push_value((long)*(long *)(((char *)(&i64data))+4));
+
+ //push LOLONG(dbl)
+ op_push_value(*(long *)(&i64data));
+ }
+ else if(type[sp]==DEF_SINGLE){
+ //single実数
+
+ float flt;
+ memcpy(&dbl,&i64data,sizeof(double));
+ flt=(float)dbl;
+ memcpy(&i3,&flt,sizeof(long));
+
+ //push term
+ op_push_value(i3);
+ }
+ else{
+ //その他
+
+ //push term
+ op_push_value((long)i64data);
+
+ if((long)i64data==0) index_stack[sp]=LITERAL_NULL;
+ }
+
+
+ //リテラル値の種類
+ if(Is64Type(type[sp])==0&&IsRealNumberType(type[sp])==0){
+ //整数(符号有り/無し)
+
+ index_stack[sp]=GetLiteralIndex(i64data);
+ }
+ }
+ sp++;
+ break;
+
+ //論理演算子
+ case CALC_XOR:
+ //value[sp-2] xor= value[sp-1]
+ //xor演算
+ if(!Calc_Xor(type,index_stack,&sp)) goto error;
+ break;
+ case CALC_OR:
+ //value[sp-2] or= value[sp-1]
+ //or演算
+ if(!Calc_Or(type,index_stack,&sp)) goto error;
+ break;
+ case CALC_AND:
+ //value[sp-2] and= value[sp-1]
+ //and演算
+ if(!Calc_And(type,index_stack,&sp)) goto error;
+ break;
+ case CALC_NOT:
+ //value[sp-1]=Not value[sp-1]
+ //NOT演算子
+ if(!Calc_Not(type,sp)) goto error;
+ break;
+
+ //比較演算子
+ case CALC_PE:
+ //value[sp-2]<=value[sp-1]
+ if(!Calc_Relation_PE(type,index_stack,&sp)) goto error;
+ break;
+ case CALC_QE:
+ //value[sp-2]>=value[sp-1]
+ if(!Calc_Relation_QE(type,index_stack,&sp)) goto error;
+ break;
+ case CALC_P:
+ //value[sp-2]value[sp-1]
+ if(!Calc_Relation_Q(type,index_stack,&sp)) goto error;
+ break;
+ case CALC_NOTEQUAL:
+ //value[sp-2]<>value[sp-1]
+ if(!Calc_Relation_NotEqual(type,&sp)) goto error;
+ break;
+ case CALC_EQUAL:
+ //value[sp-2]=value[sp-1]
+ if(!Calc_Relation_Equal(type,&sp)) goto error;
+ break;
+
+ //ビットシフト
+ case CALC_SHL:
+ //value[sp-2]=value[sp-2]<>value[sp-1]
+ if(!Calc_SHR(type,&sp)) goto error;
+ break;
+
+ //算術演算
+ case CALC_ADDITION:
+ case CALC_SUBTRACTION:
+ case CALC_PRODUCT:
+ if(!CalcTwoTerm_Arithmetic(idCalc,type,index_stack,&sp)) goto error;
+ break;
+
+ case CALC_MOD:
+ //value[sp-2]%=value[sp-1]
+ //剰余演算
+ if(!Calc_Mod(type,&sp)) goto error;
+ break;
+ case CALC_QUOTIENT:
+ //value[sp-2]/=value[sp-1];
+ //除算
+ if(!Calc_Divide(type,&sp,BaseType)) goto error;
+ break;
+ case CALC_INTQUOTIENT:
+ //value[sp-2]/=value[sp-1]
+ //整数除算
+ if(!Calc_IntDivide(type,index_stack,&sp)) goto error;
+ break;
+ case CALC_MINUSMARK:
+ //value[sp-1]=-value[sp-1]
+ //符号反転
+ if(!Calc_MinusMark(type,sp)) goto error;
+ index_stack[sp-1]=-1;
+ break;
+ case CALC_POWER:
+ //べき乗演算(浮動小数点演算のみ)
+ if(!Calc_Power(type,&sp)) goto error;
+ break;
+ case CALC_AS:
+ //キャスト
+ if(!Calc_Cast(type,index_stack,&sp)) goto error;
+ break;
+
+ default:
+ SetError(300,NULL,cp);
+ break;
+ }
+ }
+
+ if(bError) goto error;
+
+ if(sp!=1){
+ SetError(1,NULL,cp);
+ goto error;
+ }
+
+ if(bLiteralCalculation){
+ //右辺値が数値の定数式の場合
+ LONG_PTR lpClassIndex;
+ i2=StaticCalculation(true, Command,BaseType,&i64data,&lpClassIndex);
+
+ obp=BeforeObp;
+ pobj_SubAddrSchedule->num=Before_ProcAddrScheduleNum;
+ pobj_DataTableSchedule->num=Before_DataTableScheduleNum;
+ pobj_Reloc->copy(pobj_BackReloc);
+
+ if(i2==DEF_INT64||
+ i2==DEF_QWORD||
+ i2==DEF_DOUBLE){
+ //64ビット(符号有り整数/実数)
+
+ //push HILONG(i64data)
+ op_push_value((long)*(long *)(((char *)(&i64data))+4));
+
+ //push LOLONG(i64data)
+ op_push_value(*(long *)(&i64data));
+ }
+ else if(i2==DEF_SINGLE){
+ //single実数
+
+ memcpy(&dbl,&i64data,sizeof(_int64));
+
+ float flt;
+ flt=(float)dbl;
+ memcpy(&i3,&flt,sizeof(long));
+
+ //push flt
+ op_push_value(i3);
+ }
+ else{
+ //整数(符号有り/無し)
+
+ i3=(long)i64data;
+
+ if(i2==DEF_CHAR||i2==DEF_BYTE) i3=i3&0x000000FF;
+ if(i2==DEF_INTEGER||i2==DEF_WORD) i3=i3&0x0000FFFF;
+
+ //push term
+ op_push_value(i3);
+ }
+
+ type[0]=i2;
+ index_stack[0]=lpClassIndex;
+ }
+ else{
+ //右辺値が数値の定数式ではないとき
+ if(IS_LITERAL(index_stack[0])) index_stack[0]=-1;
+ }
+
+ if(plpIndex) *plpIndex=index_stack[0];
+ if(pbUseHeap) *pbUseHeap=bUseHeap[0];
+
+ int RetType;
+ RetType=type[0];
+ goto finish;
+
+
+error:
+ RetType=-1;
+ goto finish;
+
+
+finish:
+
+ for(i=0;i>value[sp-1]
+
+ int sp;
+ sp=*pStackPointer;
+
+ if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+ ////////////////
+ // 64ビット演算
+ ////////////////
+
+ //2項目は32ビット整数として利用
+ if(type[sp-1]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //fistp dword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+
+ //pop ecx
+ op_pop(REG_ECX);
+ }
+ else if(type[sp-1]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //fistp dword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+
+ //pop ecx
+ op_pop(REG_ECX);
+ }
+ else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ //pop ecx
+ op_pop(REG_ECX);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else{
+ //pop ecx
+ op_pop(REG_ECX);
+ }
+
+ //第1項を64ビットに対応させる
+ if(type[sp-2]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //fistp qword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop edx
+ op_pop(REG_EDX);
+ }
+ else if(type[sp-2]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //fistp qword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop edx
+ op_pop(REG_EDX);
+ }
+ else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop edx
+ op_pop(REG_EDX);
+ }
+ else{
+ //pop eax
+ op_pop(REG_EAX);
+
+ if(IsSignedType(type[sp-2])){
+ //符号拡張
+ //edx:eax ← eax
+
+ //cdq
+ op_cdq();
+ }
+ else{
+ //ビット拡張
+ //edx:eax ← eax
+
+ //xor edx,edx
+ op_zero_reg(REG_EDX);
+ }
+ }
+
+ if(type[sp-2]==DEF_QWORD){
+ //符号なし演算
+
+ //call _aullshr
+ extern SUBINFO *pSub_aullshr;
+ op_call(pSub_aullshr);
+ }
+ else{
+ //符号あり演算
+
+ //call _allshr
+ extern SUBINFO *pSub_allshr;
+ op_call(pSub_allshr);
+ }
+
+ //push edx
+ op_push(REG_EDX);
+
+ //push eax
+ op_push(REG_EAX);
+
+ sp--;
+ }
+ else{
+ ////////////////
+ // 32ビット演算
+ ////////////////
+
+ //2項目は32ビット整数として利用
+ if(type[sp-1]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //fistp dword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+
+ //pop ecx
+ op_pop(REG_ECX);
+ }
+ else if(type[sp-1]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //fistp dword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+
+ //pop ecx
+ op_pop(REG_ECX);
+ }
+ else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ //pop ecx
+ op_pop(REG_ECX);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else{
+ //pop ecx
+ op_pop(REG_ECX);
+ }
+
+ if(type[sp-2]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //fistp dword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+ }
+ else if(type[sp-2]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //fistp dword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+ }
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ if(type[sp-2]==DEF_DWORD){
+ //shr eax,cl
+ OpBuffer[obp++]=(char)0xD3;
+ OpBuffer[obp++]=(char)0xE8;
+ }
+ else{
+ //sar eax,cl
+ OpBuffer[obp++]=(char)0xD3;
+ OpBuffer[obp++]=(char)0xF8;
+ }
+
+ //mov dword ptr[esp],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+
+ sp--;
+
+ //整数以外の型だったときはLong型にする
+ if(!IsWholeNumberType(type[sp-1])) type[sp-1]=DEF_LONG;
+ }
+
+ *pStackPointer=sp;
+ return 1;
+}
Index: /BasicCompiler32/NumOpe_Logical.cpp
===================================================================
--- /BasicCompiler32/NumOpe_Logical.cpp (revision 3)
+++ /BasicCompiler32/NumOpe_Logical.cpp (revision 3)
@@ -0,0 +1,480 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+BOOL Calc_Xor(int *type,LONG_PTR *index_stack,int *pStackPointer){
+ //value[sp-2] xor= value[sp-1]
+ //xor演算
+
+ int sp;
+ sp=*pStackPointer;
+
+ if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+ //いずれかの項が実数のとき
+ SetError(45,"xor",cp);
+ return 0;
+ }
+
+ if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
+ type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ ////////////////////
+ // 64ビット整数演算
+ ////////////////////
+
+ //第2項を64ビットに対応させる
+ if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ //第2項が64ビット整数値のとき
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop ecx
+ op_pop(REG_ECX);
+ }
+ else{
+ //第2項がその他整数値のとき
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ if(IsSignedType(type[sp-1])){
+ //符号拡張
+ //edx:eax ← eax
+
+ //cdq
+ op_cdq();
+ }
+ else{
+ //ビット拡張
+ //edx:eax ← eax
+
+ //xor edx,edx
+ op_zero_reg(REG_EDX);
+ }
+
+ //mov ebx,eax
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0xD8;
+
+ //mov ecx,edx
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0xCA;
+ }
+
+ if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+ //第1項が64ビット整数値のとき
+
+ //xor dword ptr[esp],ebx
+ OpBuffer[obp++]=(char)0x31;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //xor dword ptr[esp+sizeof(long)],ecx
+ OpBuffer[obp++]=(char)0x31;
+ OpBuffer[obp++]=(char)0x4C;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0x04;
+ }
+ else{
+ //第1項がその他整数値のとき
+ if(IsSignedType(type[sp-2])){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //符号拡張
+ //edx:eax ← eax
+
+ //cdq
+ op_cdq();
+ }
+ else{
+ //pop eax
+ op_pop(REG_EAX);
+
+ //ビット拡張
+ //edx:eax ← eax
+
+ //xor edx,edx
+ op_zero_reg(REG_EDX);
+ }
+
+ //xor ebx,eax
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)0xD8;
+
+ //xor ecx,edx
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)0xCA;
+
+ //push ecx
+ op_push(REG_ECX);
+
+ //push ebx
+ op_push(REG_EBX);
+ }
+
+ sp--;
+ if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD;
+ else type[sp-1]=DEF_INT64;
+ }
+ else{
+ ////////////////////
+ // 整数演算
+ ////////////////////
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //xor eax,ebx
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)0xC3;
+
+ //mov dword ptr[esp],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+
+ sp--;
+ type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
+ }
+
+ *pStackPointer=sp;
+ return 1;
+}
+
+BOOL Calc_Or(int *type,LONG_PTR *index_stack,int *pStackPointer){
+ //value[sp-2] or= value[sp-1]
+ //or演算
+
+ int sp;
+ sp=*pStackPointer;
+
+ if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+ //いずれかの項が実数のとき
+ SetError(45,"or",cp);
+ return 0;
+ }
+
+ if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
+ type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ ////////////////////
+ // 64ビット整数演算
+ ////////////////////
+
+ //第2項を64ビットに対応させる
+ if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ //第2項が64ビット整数値のとき
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop ecx
+ op_pop(REG_ECX);
+ }
+ else{
+ //第2項が32ビット整数値のとき
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ if(IsSignedType(type[sp-1])){
+ //符号拡張
+ //edx:eax ← eax
+
+ //cdq
+ op_cdq();
+ }
+ else{
+ //ビット拡張
+ //edx:eax ← eax
+
+ //xor edx,edx
+ op_zero_reg(REG_EDX);
+ }
+
+ //mov ebx,eax
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0xD8;
+
+ //mov ecx,edx
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0xCA;
+ }
+
+ if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+ //第1項が64ビット整数値のとき
+
+ //or dword ptr[esp],ebx
+ OpBuffer[obp++]=(char)0x09;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //or dword ptr[esp+sizeof(long)],ecx
+ OpBuffer[obp++]=(char)0x09;
+ OpBuffer[obp++]=(char)0x4C;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0x04;
+ }
+ else{
+ //第1項が32ビット整数値のとき
+ if(IsSignedType(type[sp-2])){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //符号拡張
+ //edx:eax ← eax
+
+ //cdq
+ op_cdq();
+ }
+ else{
+ //pop eax
+ op_pop(REG_EAX);
+
+ //ビット拡張
+ //edx:eax ← eax
+
+ //xor edx,edx
+ op_zero_reg(REG_EDX);
+ }
+
+ //or ebx,eax
+ OpBuffer[obp++]=(char)0x0B;
+ OpBuffer[obp++]=(char)0xD8;
+
+ //or ecx,edx
+ OpBuffer[obp++]=(char)0x0B;
+ OpBuffer[obp++]=(char)0xCA;
+
+ //push ecx
+ op_push(REG_ECX);
+
+ //push ebx
+ op_push(REG_EBX);
+ }
+
+ sp--;
+ if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD;
+ else type[sp-1]=DEF_INT64;
+ }
+ else{
+ ////////////////////
+ // 32ビット整数演算
+ ////////////////////
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //or eax,ebx
+ OpBuffer[obp++]=(char)0x0B;
+ OpBuffer[obp++]=(char)0xC3;
+
+ //mov dword ptr[esp],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+
+ sp--;
+ type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
+ }
+
+ *pStackPointer=sp;
+ return 1;
+}
+
+BOOL Calc_And(int *type,LONG_PTR *index_stack,int *pStackPointer){
+ //value[sp-2] and= value[sp-1]
+ //and演算
+
+ int sp;
+ sp=*pStackPointer;
+
+ if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+ //いずれかの項が実数のとき
+ SetError(45,"and",cp);
+ return 0;
+ }
+
+ if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
+ type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ ////////////////////
+ // 64ビット整数演算
+ ////////////////////
+
+ //第2項を64ビットに対応させる
+ if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ //第2項が64ビット整数値のとき
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop ecx
+ op_pop(REG_ECX);
+ }
+ else{
+ //第2項が32ビット整数値のとき
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ if(IsSignedType(type[sp-1])){
+ //符号拡張
+ //edx:eax ← eax
+
+ //cdq
+ op_cdq();
+ }
+ else{
+ //ビット拡張
+ //edx:eax ← eax
+
+ //xor edx,edx
+ op_zero_reg(REG_EDX);
+ }
+
+ //mov ebx,eax
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0xD8;
+
+ //mov ecx,edx
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0xCA;
+ }
+
+ if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+ //第1項が64ビット整数値のとき
+
+ //and dword ptr[esp],ebx
+ OpBuffer[obp++]=(char)0x21;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //and dword ptr[esp+sizeof(long)],ecx
+ OpBuffer[obp++]=(char)0x21;
+ OpBuffer[obp++]=(char)0x4C;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0x04;
+ }
+ else{
+ //第1項が32ビット整数値のとき
+ if(IsSignedType(type[sp-2])){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //符号拡張
+ //edx:eax ← eax
+
+ //cdq
+ op_cdq();
+ }
+ else{
+ //pop eax
+ op_pop(REG_EAX);
+
+ //ビット拡張
+ //edx:eax ← eax
+
+ //xor edx,edx
+ op_zero_reg(REG_EDX);
+ }
+
+ //and ebx,eax
+ OpBuffer[obp++]=(char)0x23;
+ OpBuffer[obp++]=(char)0xD8;
+
+ //and ecx,edx
+ OpBuffer[obp++]=(char)0x23;
+ OpBuffer[obp++]=(char)0xCA;
+
+ //push ecx
+ op_push(REG_ECX);
+
+ //push ebx
+ op_push(REG_EBX);
+ }
+
+ sp--;
+ if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD;
+ else type[sp-1]=DEF_INT64;
+ }
+ else{
+ ////////////////////
+ // 32ビット整数演算
+ ////////////////////
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //and eax,ebx
+ OpBuffer[obp++]=(char)0x23;
+ OpBuffer[obp++]=(char)0xC3;
+
+ //mov dword ptr[esp],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+
+ sp--;
+ type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
+ }
+
+ *pStackPointer=sp;
+ return 1;
+}
+
+BOOL Calc_Not(int *type,int sp){
+ //value[sp-1]=Not value[sp-1]
+ //NOT演算子
+
+ if(IsRealNumberType(type[sp-1])){
+ //実数のとき
+ SetError(45,"Not",cp);
+ return 0;
+ }
+
+ if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ ////////////////////
+ // 64ビット整数演算
+ ////////////////////
+
+ //not dword ptr[esp]
+ OpBuffer[obp++]=(char)0xF7;
+ OpBuffer[obp++]=(char)0x14;
+ OpBuffer[obp++]=(char)0x24;
+
+ //not dword ptr[esp+4]
+ OpBuffer[obp++]=(char)0xF7;
+ OpBuffer[obp++]=(char)0x54;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0x04;
+ }
+ else{
+ ////////////////////
+ // 32ビット整数演算
+ ////////////////////
+
+ //not dword ptr[esp]
+ OpBuffer[obp++]=(char)0xF7;
+ OpBuffer[obp++]=(char)0x14;
+ OpBuffer[obp++]=(char)0x24;
+ }
+
+ return 1;
+}
Index: /BasicCompiler32/NumOpe_Relation.cpp
===================================================================
--- /BasicCompiler32/NumOpe_Relation.cpp (revision 3)
+++ /BasicCompiler32/NumOpe_Relation.cpp (revision 3)
@@ -0,0 +1,1339 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+BOOL Calc_Relation_PE(int *type_stack,LONG_PTR *index_stack,int *pStackPointer){
+ //value[sp-2]<=value[sp-1]
+
+ int sp;
+ sp=*pStackPointer;
+
+ int AnswerType;
+ AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]);
+
+ if(IsRealNumberType(AnswerType)){
+ //////////////
+ // 実数演算
+ //////////////
+
+ if(type_stack[sp-1]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else if(type_stack[sp-1]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){
+ //64ビット整数値
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else{
+ //その他整数型
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+
+ if(type_stack[sp-2]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(type_stack[sp-2]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+ }
+ else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){
+ //64ビット整数値
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else{
+ //その他整数型
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+ }
+
+ //fcompp
+ OpBuffer[obp++]=(char)0xDE;
+ OpBuffer[obp++]=(char)0xD9;
+
+ //fnstsw ax
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0xE0;
+
+ //mov ecx,0xFFFFFFFF
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //test ah,41h
+ OpBuffer[obp++]=(char)0xF6;
+ OpBuffer[obp++]=(char)0xC4;
+ OpBuffer[obp++]=(char)0x41;
+
+ //jne 5
+ OpBuffer[obp++]=(char)0x75;
+ OpBuffer[obp++]=(char)0x02;
+
+ //xor ecx,ecx(ecxを0にする)
+ op_zero_reg(REG_ECX);
+
+ //mov dword ptr[esp],ecx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x0C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(Is64Type(AnswerType)){
+ ////////////////////
+ // 64ビット整数演算
+ ////////////////////
+ int TrueSchedule,
+ FalseSchedule1,
+ FalseSchedule2;
+
+ // 第1項 <= 第2項
+
+ //第1項 edx:eax
+ //第2項 ecx:ebx
+ GetStackData_ToRegister(type_stack,sp);
+
+ //cmp edx,ecx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xD1;
+
+ if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){
+ //符号なし演算
+
+ //ja FalseSchedule1(偽へジャンプ)
+ OpBuffer[obp++]=(char)0x77;
+ }
+ else{
+ //符号あり演算
+
+ //jg FalseSchedule1(偽へジャンプ)
+ OpBuffer[obp++]=(char)0x7F;
+ }
+ FalseSchedule1=obp;
+ obp++;
+
+ if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){
+ //符号なし演算
+
+ //jb TrueSchedule(真へジャンプ)
+ OpBuffer[obp++]=(char)0x72;
+ }
+ else{
+ //符号あり演算
+
+ //jl TrueSchedule(真へジャンプ)
+ OpBuffer[obp++]=(char)0x7C;
+ }
+ TrueSchedule=obp;
+ obp++;
+
+ //cmp eax,ebx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xC3;
+
+ //ja FalseSchedule2(偽へジャンプ)
+ OpBuffer[obp++]=(char)0x77;
+ FalseSchedule2=obp;
+ obp++;
+
+ //TrueScheduleのジャンプ先の設定
+ OpBuffer[TrueSchedule]=obp-(TrueSchedule+1);
+
+ //mov eax,0FFFFFFFFh
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //jmp 2(演算終了位置へジャンプ)
+ OpBuffer[obp++]=(char)0xEB;
+ OpBuffer[obp++]=(char)0x02;
+
+ //FalseScheduleのジャンプ先の設定
+ OpBuffer[FalseSchedule1]=obp-(FalseSchedule1+1);
+ OpBuffer[FalseSchedule2]=obp-(FalseSchedule2+1);
+
+ //xor eax,eax(eaxを0にする)
+ op_zero_reg(REG_EAX);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else{
+ ////////////////////
+ // 32ビット整数演算
+ ////////////////////
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //mov ecx,0FFFFFFFFh
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //cmp eax,ebx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xC3;
+
+ if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){
+ //符号なし演算
+
+ //jbe 5(次のmovを飛び越す)
+ OpBuffer[obp++]=(char)0x76;
+ OpBuffer[obp++]=(char)0x05;
+ }
+ else{
+ //符号あり演算
+
+ //jle 5(次のmovを飛び越す)
+ OpBuffer[obp++]=(char)0x7E;
+ OpBuffer[obp++]=(char)0x05;
+ }
+
+ //mov ecx,0
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0;
+ obp+=sizeof(long);
+
+ //mov dword ptr[esp],ecx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x0C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+
+ sp--;
+ type_stack[sp-1]=DEF_LONG;
+
+ *pStackPointer=sp;
+ return 1;
+}
+
+BOOL Calc_Relation_QE(int *type_stack,LONG_PTR *index_stack,int *pStackPointer){
+ //value[sp-2]>=value[sp-1]
+
+ int sp;
+ sp=*pStackPointer;
+
+ int AnswerType;
+ AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]);
+
+ if(IsRealNumberType(AnswerType)){
+ //浮動小数点演算
+ if(type_stack[sp-1]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else if(type_stack[sp-1]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){
+ //64ビット整数値
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else{
+ //その他整数型
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+
+ if(type_stack[sp-2]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(type_stack[sp-2]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+ }
+ else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){
+ //64ビット整数値
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else{
+ //その他整数型
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+ }
+
+ //fcompp
+ OpBuffer[obp++]=(char)0xDE;
+ OpBuffer[obp++]=(char)0xD9;
+
+ //fnstsw ax
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0xE0;
+
+ //mov ecx,0xFFFFFFFF
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //test ah,1
+ OpBuffer[obp++]=(char)0xF6;
+ OpBuffer[obp++]=(char)0xC4;
+ OpBuffer[obp++]=(char)0x01;
+
+ //je 5
+ OpBuffer[obp++]=(char)0x74;
+ OpBuffer[obp++]=(char)0x05;
+
+ //mov ecx,0
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0;
+ obp+=sizeof(long);
+
+ //mov dword ptr[esp],ecx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x0C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(Is64Type(AnswerType)){
+ ////////////////////
+ // 64ビット整数演算
+ ////////////////////
+ int TrueSchedule,
+ FalseSchedule1,
+ FalseSchedule2;
+
+ // 第1項 >= 第2項
+
+ //第1項 edx:eax
+ //第2項 ecx:ebx
+ GetStackData_ToRegister(type_stack,sp);
+
+ //cmp edx,ecx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xD1;
+
+ if(IsSignedType(AnswerType)){
+ //符号あり演算
+
+ //jl FalseSchedule1(偽へジャンプ)
+ OpBuffer[obp++]=(char)0x7C;
+ }
+ else{
+ //符号なし演算
+
+ //jb FalseSchedule1(偽へジャンプ)
+ OpBuffer[obp++]=(char)0x72;
+ }
+ FalseSchedule1=obp;
+ obp++;
+
+ if(IsSignedType(AnswerType)){
+ //符号あり演算
+
+ //jg TrueSchedule(真へジャンプ)
+ OpBuffer[obp++]=(char)0x7F;
+ }
+ else{
+ //符号なし演算
+
+ //ja TrueSchedule(真へジャンプ)
+ OpBuffer[obp++]=(char)0x77;
+ }
+ TrueSchedule=obp;
+ obp++;
+
+ //cmp eax,ebx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xC3;
+
+ //jb FalseSchedule2(偽へジャンプ)
+ OpBuffer[obp++]=(char)0x72;
+ FalseSchedule2=obp;
+ obp++;
+
+ //TrueScheduleのジャンプ先の設定
+ OpBuffer[TrueSchedule]=obp-(TrueSchedule+1);
+
+ //mov eax,0FFFFFFFFh
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //jmp 2(演算終了位置へジャンプ)
+ OpBuffer[obp++]=(char)0xEB;
+ OpBuffer[obp++]=(char)0x02;
+
+ //FalseScheduleのジャンプ先の設定
+ OpBuffer[FalseSchedule1]=obp-(FalseSchedule1+1);
+ OpBuffer[FalseSchedule2]=obp-(FalseSchedule2+1);
+
+ //xor eax,eax(eaxを0にする)
+ op_zero_reg(REG_EAX);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else{
+ ////////////////////
+ // 32ビット整数演算
+ ////////////////////
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //mov ecx,0FFFFFFFFh
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //cmp eax,ebx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xC3;
+
+ if(IsSignedType(AnswerType)){
+ //符号あり演算
+
+ //jge 5(次のmovを飛び越す)符号有り
+ OpBuffer[obp++]=(char)0x7D;
+ OpBuffer[obp++]=(char)0x05;
+ }
+ else{
+ //符号なし演算
+
+ //jae 5(次のmovを飛び越す)
+ OpBuffer[obp++]=(char)0x73;
+ OpBuffer[obp++]=(char)0x05;
+ }
+
+ //mov ecx,0
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0;
+ obp+=sizeof(long);
+
+ //mov dword ptr[esp],ecx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x0C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+
+ sp--;
+ type_stack[sp-1]=DEF_LONG;
+
+ *pStackPointer=sp;
+ return 1;
+}
+
+BOOL Calc_Relation_P(int *type_stack,LONG_PTR *index_stack,int *pStackPointer){
+ //value[sp-2]value[sp-1]
+
+ int sp;
+ sp=*pStackPointer;
+
+ int AnswerType;
+ AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]);
+
+ if(IsRealNumberType(AnswerType)){
+ //////////////
+ // 実数演算
+ //////////////
+
+ if(type_stack[sp-1]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else if(type_stack[sp-1]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){
+ //64ビット整数値
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else{ //Long、DWord
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+
+ if(type_stack[sp-2]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(type_stack[sp-2]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+ }
+ else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){
+ //64ビット整数値
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else{ //Long、DWord
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+ }
+
+ //fcompp
+ OpBuffer[obp++]=(char)0xDE;
+ OpBuffer[obp++]=(char)0xD9;
+
+ //fnstsw ax
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0xE0;
+
+ //mov ecx,0xFFFFFFFF
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //test ah,41
+ OpBuffer[obp++]=(char)0xF6;
+ OpBuffer[obp++]=(char)0xC4;
+ OpBuffer[obp++]=(char)0x41;
+
+ //je 5
+ OpBuffer[obp++]=(char)0x74;
+ OpBuffer[obp++]=(char)0x05;
+
+ //mov ecx,0
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0;
+ obp+=sizeof(long);
+
+ //mov dword ptr[esp],ecx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x0C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(Is64Type(AnswerType)){
+ ////////////////////
+ // 64ビット整数演算
+ ////////////////////
+ int FalseSchedule,
+ TrueSchedule1,
+ TrueSchedule2;
+
+ // 第1項 > 第2項
+
+ //第1項 edx:eax
+ //第2項 ecx:ebx
+ GetStackData_ToRegister(type_stack,sp);
+
+ //cmp edx,ecx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xD1;
+
+ if(IsSignedType(AnswerType)){
+ //符号有り
+
+ //jg TrueSchedule1(真へジャンプ)
+ OpBuffer[obp++]=(char)0x7F;
+ }
+ else{
+ //符号無し
+
+ //ja TrueSchedule1(真へジャンプ)
+ OpBuffer[obp++]=(char)0x77;
+ }
+ TrueSchedule1=obp;
+ obp++;
+
+ if(IsSignedType(AnswerType)){
+ //符号有り
+
+ //jl FalseSchedule(偽へジャンプ)
+ OpBuffer[obp++]=(char)0x7C;
+ }
+ else{
+ //符号無し
+
+ //jb FalseSchedule(偽へジャンプ)
+ OpBuffer[obp++]=(char)0x72;
+ }
+ FalseSchedule=obp;
+ obp++;
+
+ //cmp eax,ebx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xC3;
+
+ //ja TrueSchedule2(真へジャンプ)
+ OpBuffer[obp++]=(char)0x77;
+ TrueSchedule2=obp;
+ obp++;
+
+ //FalseScheduleのジャンプ先の設定
+ OpBuffer[FalseSchedule]=obp-(FalseSchedule+1);
+
+ //xor eax,eax(eaxを0にする)
+ op_zero_reg(REG_EAX);
+
+ //jmp 5(演算終了位置へジャンプ)
+ OpBuffer[obp++]=(char)0xEB;
+ OpBuffer[obp++]=(char)0x05;
+
+ //TrueScheduleのジャンプ先の設定
+ OpBuffer[TrueSchedule1]=obp-(TrueSchedule1+1);
+ OpBuffer[TrueSchedule2]=obp-(TrueSchedule2+1);
+
+ //mov eax,0FFFFFFFFh
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else{
+ ////////////////////
+ // 32ビット整数演算
+ ////////////////////
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //mov ecx,0FFFFFFFFh
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //cmp eax,ebx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xC3;
+
+ if(IsSignedType(AnswerType)){
+ //jg 5(次のmovを飛び越す)
+ OpBuffer[obp++]=(char)0x7F;
+ OpBuffer[obp++]=(char)0x05;
+ }
+ else{
+ //ja 5(次のmovを飛び越す)
+ OpBuffer[obp++]=(char)0x77;
+ OpBuffer[obp++]=(char)0x05;
+ }
+
+ //mov ecx,0
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0;
+ obp+=sizeof(long);
+
+ //mov dword ptr[esp],ecx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x0C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+
+ sp--;
+ type_stack[sp-1]=DEF_LONG;
+
+ *pStackPointer=sp;
+ return 1;
+}
+
+BOOL Calc_Relation_NotEqual(int *type,int *pStackPointer){
+ //value[sp-2]<>value[sp-1]
+
+ int sp;
+ sp=*pStackPointer;
+
+ if(type[sp-2]==DEF_DOUBLE||type[sp-2]==DEF_SINGLE||
+ type[sp-1]==DEF_DOUBLE||type[sp-1]==DEF_SINGLE){
+ //////////////
+ // 実数演算
+ //////////////
+
+ if(type[sp-1]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else if(type[sp-1]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ //64ビット整数値
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else{ //Long、DWord
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+
+ if(type[sp-2]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(type[sp-2]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+ }
+ else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+ //64ビット整数値
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else{ //Long、DWord
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+ }
+
+ //fcompp
+ OpBuffer[obp++]=(char)0xDE;
+ OpBuffer[obp++]=(char)0xD9;
+
+ //fnstsw ax
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0xE0;
+
+ //mov ecx,0xFFFFFFFF
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //test ah,40
+ OpBuffer[obp++]=(char)0xF6;
+ OpBuffer[obp++]=(char)0xC4;
+ OpBuffer[obp++]=(char)0x40;
+
+ //je 5
+ OpBuffer[obp++]=(char)0x74;
+ OpBuffer[obp++]=(char)0x05;
+
+ //mov ecx,0
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0;
+ obp+=sizeof(long);
+
+ //mov dword ptr[esp],ecx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x0C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
+ type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ ////////////////////
+ // 64ビット整数演算
+ ////////////////////
+ int TrueSchedule1,
+ TrueSchedule2;
+
+ // 第1項 <> 第2項
+
+ //第1項 edx:eax
+ //第2項 ecx:ebx
+ GetStackData_ToRegister(type,sp);
+
+ //cmp eax,ebx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xC3;
+
+ //jnz TrueSchedule1(真へジャンプ)
+ OpBuffer[obp++]=(char)0x75;
+ TrueSchedule1=obp;
+ obp++;
+
+ //cmp edx,ecx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xD1;
+
+ //jnz TrueSchedule2(真へジャンプ)
+ OpBuffer[obp++]=(char)0x75;
+ TrueSchedule2=obp;
+ obp++;
+
+ //xor eax,eax(eaxを0にする)
+ op_zero_reg(REG_EAX);
+
+ //jmp 5(演算終了位置へジャンプ)
+ OpBuffer[obp++]=(char)0xEB;
+ OpBuffer[obp++]=(char)0x05;
+
+ //TrueScheduleのジャンプ先の設定
+ OpBuffer[TrueSchedule1]=obp-(TrueSchedule1+1);
+ OpBuffer[TrueSchedule2]=obp-(TrueSchedule2+1);
+
+ //mov eax,0FFFFFFFFh
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else{
+ ////////////////////
+ // 32ビット整数演算
+ ////////////////////
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //xor eax,ebx
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)0xC3;
+
+ //jz 5(次のmovを飛び越す)
+ OpBuffer[obp++]=(char)0x74;
+ OpBuffer[obp++]=(char)0x05;
+
+ //mov eax,0FFFFFFFFh
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //mov dword ptr[esp],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+ }
+
+ sp--;
+ type[sp-1]=DEF_LONG;
+
+ *pStackPointer=sp;
+ return 1;
+}
+
+BOOL Calc_Relation_Equal(int *type,int *pStackPointer){
+ //value[sp-2]=value[sp-1]
+
+ int sp;
+ sp=*pStackPointer;
+
+ if(type[sp-2]==DEF_DOUBLE||type[sp-2]==DEF_SINGLE||
+ type[sp-1]==DEF_DOUBLE||type[sp-1]==DEF_SINGLE){
+ //////////////
+ // 実数演算
+ //////////////
+
+ if(type[sp-1]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else if(type[sp-1]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ //64ビット整数値
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else{ //Long、DWord
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+
+ if(type[sp-2]==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(type[sp-2]==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+ }
+ else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+ //64ビット整数値
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else{ //Long、DWord
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+ }
+
+ //fcompp
+ OpBuffer[obp++]=(char)0xDE;
+ OpBuffer[obp++]=(char)0xD9;
+
+ //fnstsw ax
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0xE0;
+
+ //mov ecx,0xFFFFFFFF
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //test ah,40
+ OpBuffer[obp++]=(char)0xF6;
+ OpBuffer[obp++]=(char)0xC4;
+ OpBuffer[obp++]=(char)0x40;
+
+ //jne 5
+ OpBuffer[obp++]=(char)0x75;
+ OpBuffer[obp++]=(char)0x05;
+
+ //mov ecx,0
+ OpBuffer[obp++]=(char)0xB9;
+ *((long *)(OpBuffer+obp))=0;
+ obp+=sizeof(long);
+
+ //mov dword ptr[esp],ecx
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x0C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
+ type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ ////////////////////
+ // 64ビット整数演算
+ ////////////////////
+ int FalseSchedule1,
+ FalseSchedule2;
+
+ // 第1項 == 第2項
+
+ //第1項 edx:eax
+ //第2項 ecx:ebx
+ GetStackData_ToRegister(type,sp);
+
+ //cmp eax,ebx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xC3;
+
+ //jnz FalseSchedule1(偽へジャンプ)
+ OpBuffer[obp++]=(char)0x75;
+ FalseSchedule1=obp;
+ obp++;
+
+ //cmp edx,ecx
+ OpBuffer[obp++]=(char)0x3B;
+ OpBuffer[obp++]=(char)0xD1;
+
+ //jnz FalseSchedule2(偽へジャンプ)
+ OpBuffer[obp++]=(char)0x75;
+ FalseSchedule2=obp;
+ obp++;
+
+ //mov eax,0FFFFFFFFh
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //jmp 2(演算終了位置へジャンプ)
+ OpBuffer[obp++]=(char)0xEB;
+ OpBuffer[obp++]=(char)0x02;
+
+ //FalseScheduleのジャンプ先の設定
+ OpBuffer[FalseSchedule1]=obp-(FalseSchedule1+1);
+ OpBuffer[FalseSchedule2]=obp-(FalseSchedule2+1);
+
+ //xor eax,eax(eaxを0にする)
+ op_zero_reg(REG_EAX);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else{
+ ////////////////////
+ // 32ビット整数演算
+ ////////////////////
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop ebx
+ op_pop(REG_EBX);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //xor eax,ebx
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)0xC3;
+
+ //jz 5(次のmovを飛び越す)
+ OpBuffer[obp++]=(char)0x74;
+ OpBuffer[obp++]=(char)0x05;
+
+ //mov eax,0FFFFFFFFh
+ OpBuffer[obp++]=(char)0xB8;
+ *((long *)(OpBuffer+obp))=0xFFFFFFFF;
+ obp+=sizeof(long);
+
+ //not eax
+ OpBuffer[obp++]=(char)0xF7;
+ OpBuffer[obp++]=(char)0xD0;
+
+ //mov dword ptr[esp],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+ }
+
+ sp--;
+ type[sp-1]=DEF_LONG;
+
+ *pStackPointer=sp;
+ return 1;
+}
Index: /BasicCompiler32/NumOpe_TypeOperation.cpp
===================================================================
--- /BasicCompiler32/NumOpe_TypeOperation.cpp (revision 3)
+++ /BasicCompiler32/NumOpe_TypeOperation.cpp (revision 3)
@@ -0,0 +1,213 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void ExtendStackTo32(int type);
+void ExtendStackTo64(int type){
+ if(Is64Type(type)) return;
+
+ //32ビットに拡張
+ ExtendStackTo32(type);
+
+ //64ビットに拡張
+ if(IsSignedType(type)){
+ //符号あり
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //cdq
+ op_cdq();
+
+ //push edx
+ op_push(REG_EDX);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else{
+ //符号なし
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //push 0
+ op_push_value(0);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+}
+void ExtendStackTo32(int type){
+ if(GetTypeSize(type,-1)==sizeof(long)) return;
+
+ if(Is64Type(type)){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop edx
+ op_pop(REG_EDX);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else if(type==DEF_INTEGER){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //movsx eax,ax
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else if(type==DEF_WORD){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //and eax,0000FFFFh
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=0x0000FFFF;
+ obp+=sizeof(long);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else if(type==DEF_CHAR){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //movsx eax,al
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else if(type==DEF_BYTE){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //and eax,000000FFh
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=0x000000FF;
+ obp+=sizeof(long);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+}
+void ExtendStackTo16(int type){
+ if(type==DEF_CHAR){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //movsx eax,al
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else if(type==DEF_BYTE){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //and eax,000000FFh
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=0x000000FF;
+ obp+=sizeof(long);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+}
+void ExtendStackTo8(int type){
+ if(Is64Type(type)){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop edx
+ op_pop(REG_EDX);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+}
+
+
+void ChangeTypeToWhole(int OldType,int NewType){
+ if(OldType==DEF_DOUBLE){
+ if(Is64Type(NewType)){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //fistp qword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+ }
+ else{
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //fistp dword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+ }
+ }
+ else if(OldType==DEF_SINGLE){
+ if(Is64Type(NewType)){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //fistp qword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+ }
+ else{
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //fistp dword ptr[esp]
+ fpu_cast();
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ fpu_cast_end();
+ }
+ }
+ else{
+ //整数から整数へ変換
+
+ if(Is64Type(NewType)){
+ ExtendStackTo64(OldType);
+ }
+ else if(GetTypeSize(NewType,-1)==sizeof(long)){
+ ExtendStackTo32(OldType);
+ }
+ else if(GetTypeSize(NewType,-1)==sizeof(short)){
+ ExtendStackTo16(OldType);
+ }
+ else if(GetTypeSize(NewType,-1)==sizeof(char)){
+ ExtendStackTo8(OldType);
+ }
+ }
+}
Index: /BasicCompiler32/Opcode.h
===================================================================
--- /BasicCompiler32/Opcode.h (revision 3)
+++ /BasicCompiler32/Opcode.h (revision 3)
@@ -0,0 +1,313 @@
+//Opcode.h
+
+//未定義の定数情報
+#define IMAGE_FILE_MACHINE_AMD64 0x8664
+
+
+//レジスタを示す定数
+#define REG_EAX 0x00 //reg:000
+#define REG_ECX 0x01 //reg:001
+#define REG_EDX 0x02 //reg:010
+#define REG_EBX 0x03 //reg:011
+#define REG_ESP 0x04 //reg:100
+#define REG_EBP 0x05 //reg:101
+#define REG_ESI 0x06 //reg:110
+#define REG_EDI 0x07 //reg:111
+
+#define REG_RAX REG_EAX
+#define REG_RCX REG_ECX
+#define REG_RDX REG_EDX
+#define REG_RBX REG_EBX
+#define REG_RSP REG_ESP
+#define REG_RBP REG_EBP
+#define REG_RSI REG_ESI
+#define REG_RDI REG_EDI
+
+#define REGISTER_OPERAND(reg) (reg&0x07)
+
+//変数の種類
+#define NON_VAR 0
+#define VAR_GLOBAL 1 //Global Variable
+#define VAR_LOCAL 2 //Local Variable
+#define VAR_REFLOCAL 3 //Local Refference Variable
+#define VAR_DIRECTMEM 4 //Direct memory
+
+extern int cp;
+extern int obp;
+extern char *OpBuffer;
+
+//ラベルアドレス
+struct LABEL{
+ char *pName;
+ int line;
+ DWORD address;
+};
+
+//Goto未知ラベル
+struct GOTOLABELSCHEDULE{
+ char *pName;
+ int line;
+ DWORD pos;
+ DWORD now_cp;
+};
+
+//プロシージャの種類
+#define PROC_DEFAULT 1 //ユーザー定義関数
+#define PROC_DLL 2 //DLL関数
+#define PROC_BUILTIN 3 //コンパイラ埋め込み型
+#define PROC_PTR 4 //関数ポインタ
+
+//プロシージャ
+struct PROCEDURE{
+ char name[255];
+ int address;
+ int types[MAX_PARMS];
+ _int8 ByVal[MAX_PARMS];
+ BOOL ReturnType;
+};
+
+//With情報
+struct WITHINFO{
+ char **ppName;
+ int *pWithCp;
+ int num;
+};
+
+
+//MakePeHdr.cpp
+int AddDataTable(char *buffer,int length);
+
+//RSrcSection.cpp
+char *GetRSrcSectionBuffer(int *pLen);
+
+//Compile.cpp
+void ChangeOpcode(char *Command);
+void GetGlobalDataForDll(void);
+DWORD CompileBuffer(char Return_Sequence,WORD Return_Command);
+
+//Compile_Calc.cpp
+void ChangeTypeToDouble_ToFpuReg(int OldType);
+void ChangeTypeToDouble(int OldType);
+void ChangeTypeToSingle(int OldType);
+void ChangeTypeToInt64(int OldType);
+void ChangeTypeToLong(int OldType);
+void ChangeTypeToInteger(int OldType);
+void ChangeTypeToByte(int OldType);
+void OpcodeCalc(char *Command);
+
+//NumOpe.cpp
+void PushReturnValue(int type);
+int NumOpe(char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap=0);
+
+//NumOpe_Arithmetic.cpp
+void GetStackData_ToRegister(int *type,int sp);
+BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Mod(int *type,int *pStackPointer);
+BOOL Calc_Divide(int *type,int *pStackPointer,int BaseType);
+BOOL Calc_IntDivide(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_MinusMark(int *type,int sp);
+BOOL Calc_Power(int *type,int *pStackPointer);
+BOOL Calc_Cast(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_SHL(int *type,int *pStackPointer);
+BOOL Calc_SHR(int *type,int *pStackPointer);
+
+//NumOpe_Logical.cpp
+BOOL Calc_Xor(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Or(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_And(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Not(int *type,int sp);
+
+//NumOpe_Relation.cpp
+BOOL Calc_Relation_PE(int *type_stack,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Relation_QE(int *type_stack,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Relation_P(int *type_stack,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Relation_Q(int *type_stack,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Relation_NotEqual(int *type,int *pStackPointer);
+BOOL Calc_Relation_Equal(int *type,int *pStackPointer);
+
+//NumOpe_TypeOperation.cpp
+void ExtendStackTo64(int type);
+void ChangeTypeToWhole(int OldType,int NewType);
+
+//Compile_Set_Var.cpp
+BOOL IsUse_ecx(RELATIVE_VAR *pRelativeVar);
+void SetObjectVariable(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap);
+void SetDoubleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
+void SetSingleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
+void SetInt64Variable(int type,RELATIVE_VAR *pRelative);
+void SetDWordVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
+void SetLongVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
+void Set16Variable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
+void Set8Variable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
+
+//increment.cpp
+void IncDec(int idCalc, char *lpszLeft, char *lpszRight);
+
+//calc2.cpp
+#define EXP_TYPE_NUMBER 1
+#define EXP_TYPE_EAX 2
+#define EXP_TYPE_FPU 3
+#define EXP_TYPE_VAR 4
+int NumOpEx(char *Command,double *pDbl,DWORD *pdwType,RELATIVE_VAR *pRelativeVar);
+
+//SetVar.cpp
+BOOL SetVariable(DWORD dwVarType,RELATIVE_VAR *pVarRelativeVar,
+ DWORD dwExpType,DWORD dwType,void *data);
+
+//Compile_Calc_PushVar.cpp
+void SetReg_RealVariable(int type,RELATIVE_VAR *pRelativeVar);
+void SetReg_WholeVariable(int type,RELATIVE_VAR *pRelativeVar,int reg);
+void PushDoubleVariable(RELATIVE_VAR *pRelativeVar);
+void PushLongVariable(RELATIVE_VAR *pRelativeVar);
+void PushIntegerVariable(RELATIVE_VAR *pRelativeVar);
+void PushWordVariable(RELATIVE_VAR *pRelativeVar);
+void PushCharVariable(RELATIVE_VAR *pRelativeVar);
+void PushByteVariable(RELATIVE_VAR *pRelativeVar);
+
+//Compile_Object.cpp
+int Operator_New(char *Parameter,LONG_PTR *plpIndex);
+void OpcodeDelete(char *Parameter);
+
+//Compile_Var.cpp
+void GetWithName(char *buffer);
+void SetThisPtrToReg(int reg);
+BOOL GetVarOffset(BOOL bError,char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
+BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf);
+#define DIMFLAG_INITDEBUGVAR 1
+#define DIMFLAG_NONCALL_CONSTRACTOR 2
+#define DIMFLAG_STATIC 4
+void OpcodeDim(char *Parameter,DWORD dwFlag);
+void SetVarPtrToEax(RELATIVE_VAR *pRelativeVar);
+
+//CParameter.cpp
+#define OVERLOAD_LEVEL1 1
+#define OVERLOAD_LEVEL2 2
+#define OVERLOAD_LEVEL3 3
+class CParameter{
+ char *Parms[255];
+ TYPEINFO types[255];
+ int ParmsNum;
+
+ TYPEINFO ReturnTypeInfo;
+
+public:
+ CParameter(char *buffer);
+ CParameter(PARAMETER_INFO *pParamInfo,int ParmNum);
+ ~CParameter();
+ void SetReturnType(TYPEINFO *pTypeInfo);
+
+private:
+ BOOL _overload_check(PARAMETER_INFO *ppi,int pi_num,TYPEINFO *pReturnTypeInfo,int overload_level);
+ SUBINFO *OverloadSolutionWithReturnType(char *name,SUBINFO **ppsi,int num);
+public:
+ SUBINFO *OverloadSolution(char *name,SUBINFO **ppsi,int num);
+
+ BOOL ErrorCheck(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
+ void MacroParameterSupport(PARAMETER_INFO *ppi);
+ void SetObjectParameter(CClass *pobj_Class,LPSTR Parameter);
+ int SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
+};
+
+//Compile_CallProc.cpp
+void AddLocalVarAddrSchedule();
+int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex);
+BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo);
+#define PROCFLAG_NEW 1
+int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex);
+int Opcode_CallProc(char *Parameter,SUBINFO *psi,LONG_PTR *plpIndex,DWORD dwFlags,char *ObjectName,int RefType);
+int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex);
+
+//Compile_ProcOp.cpp
+void CompileLocal();
+
+//Compile_Func.cpp
+int GetFunctionType(int FuncNum);
+int GetFunctionFromName(char *FuncName);
+int Opcode_CallFunc(char *Parameter,int FuncNum);
+
+//OperatorProc.cpp
+void FreeTempObject(int reg,CClass *pobj_c);
+int CallOperatorProc(int idCalc,TYPEINFO *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
+void CallCastOperatorProc(int &CalcType,LONG_PTR &lpCalcIndex,BOOL bCalcUseHeap,int ToType,LONG_PTR lpToIndex);
+void CallArrayOperatorProc(CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo);
+
+//Compile_Statement.cpp
+void OpcodeOthers(char *Command);
+void OpcodeIf(char *Parameter);
+void OpcodeGoto(char *Parameter);
+void OpcodeWhile(char *Parameter);
+void OpcodeExitWhile(void);
+void OpcodeFor(char *Parameter);
+void OpcodeExitFor(void);
+void OpcodeDo(char *Parameter);
+void OpcodeExitDo(void);
+void OpcodeContinue(void);
+void OpcodeExitSub(void);
+void OpcodeSelect(char *Parameter);
+void OpcodeCase(char *Parameter);
+void OpcodeGosub(char *Parameter);
+void OpcodeReturn(char *Parameter);
+void Opcode_Input(char *Parameter);
+void Opcode_Print(char *Parameter,BOOL bWrite);
+void OpcodeCallPtr(char *Parameter);
+void OpcodeSetPtrData(char *Parameter,int type);
+
+
+
+
+////////////////////////////////
+// IA-32機械語生成に利用する関数郡
+////////////////////////////////
+
+//Mod(モード)
+#define MOD_BASE (char)0x00
+#define MOD_DISP32 (char)0xFF
+#define MOD_BASE_DISP8 (char)0x40
+#define MOD_BASE_DISP32 (char)0x80
+#define MOD_REG (char)0xC0
+
+#define USE_OFFSET 1
+#define NON_OFFSET 0
+
+//op32_main.cpp
+BOOL IsSafeReg(int reg);
+void op_mov_RV (int reg,int offset);
+void op_mov_RV (int op_size,int reg,int offset);
+void op_mov_RR (int reg1,int reg2);
+void op_mov_RM (int op_size,int reg,int base_reg,int offset,char mod);
+void op_mov_RM_ex (int op_size,int reg,int base_reg1,int base_reg2,int offset,BOOL bUseOffset);
+void op_mov_MR (int op_size,int reg,int base_reg,int offset,char mod);
+void op_mov_MR_ex (int op_size,int reg,int base_reg1,int base_reg2,int offset,BOOL bUseOffset);
+void op_movsx_R32R16 (int reg32,int reg16);
+void op_movsx_R32R8 (int reg32,int reg8);
+void op_movsx_R16R8 (int reg16,int reg8);
+void op_inc (int reg);
+void op_dec (int reg);
+void op_add_RV8 (int reg,char cValue);
+void op_add_RM (int op_size,int reg,int base_reg,int offset,char mod);
+void op_adc_RV8 (int reg,char cValue);
+void op_sub_RV8 (int reg,char cValue);
+void op_sbb_RV8 (int reg,char cValue);
+void op_and_RV (int reg,int value);
+void op_cdq ();
+
+void op_rep_movs (int op_size);
+
+void op_push(int reg);
+void op_push_value(long data);
+void op_pop(int reg);
+void op_add_esp(int num);
+void op_sub_esp(int num);
+void op_test(int reg1,int reg2);
+void op_fld_ptr_esp(int type);
+void op_fld_basereg (int type,int base_reg);
+void op_fld_base_offset (int type,int base_reg,int offset);
+void op_fld_base_offset_ex (int type,int base_reg1,int base_reg2,int offset,BOOL bUseOffset);
+void op_fstp_basereg (int type,int base_reg);
+void op_fstp_base_offset (int type,int base_reg,int offset);
+void op_fstp_base_offset_ex (int type,int base_reg1,int base_reg2,int offset,BOOL bUseOffset);
+void op_zero_reg(int reg);
+void fpu_cast();
+void fpu_cast_end();
+
+void op_call(SUBINFO *psi);
Index: /BasicCompiler32/OperatorProc.cpp
===================================================================
--- /BasicCompiler32/OperatorProc.cpp (revision 3)
+++ /BasicCompiler32/OperatorProc.cpp (revision 3)
@@ -0,0 +1,287 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void FreeTempObject(int reg,CClass *pobj_c){
+ if(!IsSafeReg(reg)) SetError(300,NULL,cp);
+
+ if(pobj_c->DestructorMemberSubIndex!=-1){
+ //push reg
+ op_push(reg);
+
+ //call DestructorProcAddr
+ op_call(pobj_c->ppobj_Method[pobj_c->DestructorMemberSubIndex]->psi);
+ }
+
+ //push reg
+ op_push(reg);
+
+ //call free
+ extern SUBINFO *pSub_free;
+ op_call(pSub_free);
+}
+
+int CallOperatorProc(int idCalc,TYPEINFO *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
+ //オーバーロードされたオペレータ関数を呼び出す
+ CClass *pobj_c;
+ pobj_c=(CClass *)index_stack[sp-2];
+
+ SUBINFO **ppsi;
+ int num;
+ ppsi=pobj_c->GetOperatorSubInfo(idCalc,num);
+ if(num==0){
+ HeapDefaultFree(ppsi);
+
+ return 0;
+ }
+
+
+ //項の数
+ BOOL bTwoTerm=1;
+ if(idCalc==CALC_AS) bTwoTerm=0;
+
+
+ int i;
+ BOOL bReturnTypeIsObject=1;
+ TYPEINFO ReturnType={DEF_OBJECT,ppsi[0]->u.ReturnIndex};
+ for(i=0;iReturnType!=DEF_OBJECT)
+ bReturnTypeIsObject=0;
+ }
+
+ if(bReturnTypeIsObject==0){
+ if(pBaseTypeInfo){
+ if(pBaseTypeInfo->type==DEF_OBJECT){
+ bReturnTypeIsObject=1;
+ ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex;
+ }
+ }
+ }
+
+
+
+ /////////////////////////////////////////////
+ // オーバーロード解決用のパラメータを設定
+ /////////////////////////////////////////////
+
+ PARAMETER_INFO *ppi;
+ int iParmNum=0;
+
+ //_System_LocalThis
+ ppi=(PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
+ ppi[iParmNum].bArray=0;
+ ppi[iParmNum].bByVal=0;
+ ppi[iParmNum].name=0;
+ ppi[iParmNum].type=DEF_PTR_VOID;
+ ppi[iParmNum].u.index=-1;
+ ppi[iParmNum].SubScripts[0]=-1;
+ iParmNum++;
+
+ if(bTwoTerm){
+ ppi[iParmNum].bArray=0;
+ ppi[iParmNum].bByVal=0;
+ ppi[iParmNum].name=0;
+ ppi[iParmNum].type=type[sp-1];
+ ppi[iParmNum].u.index=index_stack[sp-1];
+ ppi[iParmNum].SubScripts[0]=-1;
+ iParmNum++;
+ }
+
+
+ //オーバーロードを解決
+ char temporary[255];
+ if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
+ else GetCalcName(idCalc,temporary);
+ SUBINFO *psi;
+ psi=OverloadSolution(temporary,ppsi,num,ppi,iParmNum,pBaseTypeInfo);
+ HeapDefaultFree(ppsi);
+
+ if(!psi){
+ HeapDefaultFree(ppi);
+ return -1;
+ }
+ else{
+ //オーバーロードされていないが、パラメータ個数が一致しないとき
+ if(iParmNum!=psi->ParmNum){
+ HeapDefaultFree(ppi);
+ return -1;
+ }
+ }
+
+ for(i=0;ipParmInfo[i].type,
+ psi->pParmInfo[i].u.index,
+ ppi[i].type,
+ ppi[i].u.index,
+ "",
+ i);
+ }
+
+ HeapDefaultFree(ppi);
+
+ int right_side_size;
+ if(type[sp-1]==DEF_OBJECT) right_side_size=PTR_SIZE;
+ else right_side_size=GetTypeSize(type[sp-1],index_stack[sp-1]);
+
+ if(bTwoTerm){
+ if(psi->pParmInfo[1].type==DEF_OBJECT&&psi->pParmInfo[1].bByVal){
+ //一時オブジェクトはメソッド内で破棄される
+ bUseHeap[sp-1]=0;
+ }
+ }
+
+
+ if(psi->ReturnType==DEF_OBJECT){
+ //////////////////////////////////////////////////////
+ // 戻り値にオブジェクト インスタンスを持つ場合
+ // ※ByRef _System_ReturnObject パラメータ用領域を取得
+ //////////////////////////////////////////////////////
+
+ int object_size;
+ object_size=GetSizeOfClass(psi->u.Return_pobj_c);
+
+ //push object_size
+ op_push_value(object_size);
+
+ //call calloc
+ extern SUBINFO *pSub_calloc;
+ op_call(pSub_calloc);
+
+ //mov ebx,eax
+ op_mov_RR(REG_EBX,REG_EAX);
+ }
+
+
+ //2つの項を取り出す
+ if(bTwoTerm){
+ if(right_side_size==sizeof(_int64)){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop edx
+ op_pop(REG_EDX);
+ }
+ else{
+ //pop eax
+ op_pop(REG_EAX);
+ }
+ }
+
+ //pop ecx
+ op_pop(REG_ECX);
+
+
+ //ヒープ解放用に退避
+ if(bUseHeap[sp-1]){
+ //mov esi,eax
+ op_mov_RR(REG_ESI,REG_EAX);
+ }
+ if(bUseHeap[sp-2]){
+ //mov edi,ecx
+ op_mov_RR(REG_EDI,REG_ECX);
+ }
+
+
+
+ if(bTwoTerm){
+ if(right_side_size==sizeof(_int64)){
+ //push edx
+ op_push(REG_EDX);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else{
+ //push eax
+ op_push(REG_EAX);
+ }
+ }
+
+ if(psi->ReturnType==DEF_OBJECT){
+ //push ebx
+ op_push(REG_EBX);
+ }
+
+ //push ecx
+ op_push(REG_ECX);
+
+ //call operator_proc
+ op_call(psi);
+
+ if(psi->ReturnType!=-1){
+ //スタックへプッシュ
+ PushReturnValue(psi->ReturnType);
+ }
+
+ if(bUseHeap[sp-1]){
+ FreeTempObject(REG_ESI,(CClass *)index_stack[sp-1]);
+ }
+ if(bUseHeap[sp-2]){
+ FreeTempObject(REG_EDI,(CClass *)index_stack[sp-2]);
+ }
+
+ sp--;
+ type[sp-1]=psi->ReturnType;
+ index_stack[sp-1]=psi->u.ReturnIndex;
+
+ if(psi->ReturnType==DEF_OBJECT){
+ //Object型が戻ったときはヒープ領域にインスタンスが格納されている
+ //※後にfreeする必要あり
+ bUseHeap[sp-1]=1;
+ }
+ else bUseHeap[sp-1]=0;
+
+ return 1;
+}
+
+void CallCastOperatorProc(int &CalcType,LONG_PTR &lpCalcIndex,BOOL bCalcUseHeap,int ToType,LONG_PTR lpToIndex){
+ int type[10];
+ LONG_PTR index_stack[10];
+ BOOL array_bUseHeap[10];
+ int sp=2;
+
+ if(bCalcUseHeap){
+ //未解放のインスタンスが存在する旨を示す警告
+ SetError(-105,NULL,cp);
+ }
+
+ //左辺
+ type[0]=CalcType;
+ index_stack[0]=lpCalcIndex;
+ array_bUseHeap[0]=0;
+ type[1]=ToType;
+ index_stack[1]=lpToIndex;
+ array_bUseHeap[1]=0;
+
+ TYPEINFO BaseTypeInfo={ToType,lpToIndex};
+
+ int iRet;
+ iRet=CallOperatorProc(CALC_AS,&BaseTypeInfo,type,index_stack,array_bUseHeap,sp);
+ if(iRet==1){
+ //成功したとき
+ CalcType=type[0];
+ lpCalcIndex=index_stack[0];
+ return;
+ }
+ else if(iRet==-1){
+ //エラーが発行されたとき
+ return;
+ }
+
+ //エラーを発行
+ SetError(-1,"キャスト演算子がオーバーロードされていません。",cp);
+}
+void CallArrayOperatorProc(CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo){
+ SUBINFO **ppsi;
+ int num;
+ ppsi=pobj_Class->GetOperatorSubInfo(CALC_ARRAY_GET,num);
+ if(num==0){
+ HeapDefaultFree(ppsi);
+
+ return;
+ }
+
+ RetTypeInfo.type=Opcode_CallProc(Parameter,ppsi[0],&RetTypeInfo.u.lpIndex,0,ObjectName,DEF_OBJECT);
+
+ HeapDefaultFree(ppsi);
+}
Index: /BasicCompiler32/VarList.cpp
===================================================================
--- /BasicCompiler32/VarList.cpp (revision 3)
+++ /BasicCompiler32/VarList.cpp (revision 3)
@@ -0,0 +1,1322 @@
+#include "../BasicCompiler_Common/common.h"
+
+//デバッグ用
+#include "../BasicCompiler_Common/debug.h"
+
+//変数リストのツリーハンドル
+HWND hVarTree_Global,hVarTree_Local,hVarTree_This;
+
+int VarList_Array(HWND hVarTree,HTREEITEM hParent,DWORD offset,int type,int *SubScripts,LONG_PTR lpIndex);
+void VarList_Member(HWND hVarTree,HTREEITEM hParent,DWORD pTopOffset,CClass *pobj_c,BOOL bPtr);
+void VarList_Insert(HWND hVarTree,TV_INSERTSTRUCT *lptv,char *VarName,int type,DWORD offset,LONG_PTR lpIndex){
+ extern HANDLE hDebugProcess;
+ int i2;
+ char temporary[255],temp2[255];
+ DWORD dwData,dwAccessByte;
+ double dbl;
+ float flt;
+ WORD wData;
+ BYTE byteData;
+ HTREEITEM hParent;
+
+ if(type==DEF_OBJECT){
+ sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,offset);
+ lptv->item.iImage=1;
+ lptv->item.iSelectedImage=1;
+ hParent=TreeView_InsertItem(hVarTree,lptv);
+
+ VarList_Member(hVarTree,hParent,offset,(CClass *)lpIndex,0);
+ return;
+ }
+ if(type==DEF_PTR_OBJECT){
+ i2=ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(DWORD),&dwAccessByte);
+
+ sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_POINTEROFOBJECT,dwData);
+ lptv->item.iImage=4;
+ lptv->item.iSelectedImage=4;
+ hParent=TreeView_InsertItem(hVarTree,lptv);
+
+ if(i2) VarList_Member(hVarTree,hParent,dwData,(CClass *)lpIndex,1);
+ return;
+ }
+ else{
+ if(type==DEF_PTR_BYTE){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(DWORD),&dwAccessByte)){
+ for(i2=0;;i2++){
+ if(!ReadProcessMemory(hDebugProcess,(void *)(dwData+i2),&temporary[i2],1,&dwAccessByte)){
+ i2=-1;
+ break;
+ }
+ if(temporary[i2]=='\0') break;
+ if(i2==64){
+ lstrcpy(temporary+i2,"...");
+ break;
+ }
+ }
+ if(i2==-1) sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,dwData,dwData);
+ else sprintf(lptv->item.pszText,"%s %d(&H%X) \"%s\"",VarName,dwData,dwData,temporary);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_DOUBLE){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&dbl,sizeof(double),&dwAccessByte)){
+ sprintf(lptv->item.pszText,"%s %.15g",VarName,dbl);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_SINGLE){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&flt,sizeof(float),&dwAccessByte)){
+ sprintf(lptv->item.pszText,"%s %.6g",VarName,flt);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_INT64){
+ _int64 i64data;
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&dwAccessByte)){
+ _i64toa(i64data,temporary,10);
+ _i64toa(i64data,temp2,16);
+ CharUpper(temp2);
+ sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_QWORD){
+ _int64 i64data;
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&dwAccessByte)){
+ _ui64toa(i64data,temporary,10);
+ _ui64toa(i64data,temp2,16);
+ CharUpper(temp2);
+ sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_LONG){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(DWORD),&dwAccessByte)){
+ sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,dwData,dwData);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_DWORD||IsPtrType(type)){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(DWORD),&dwAccessByte)){
+ sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,dwData,dwData);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_INTEGER){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&dwAccessByte)){
+ sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(short)wData,(short)wData);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_WORD){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&dwAccessByte)){
+ sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,wData,wData);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_CHAR){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&dwAccessByte)){
+ temporary[0]=byteData;
+ temporary[1]=0;
+ sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,(char)byteData,byteData,temporary);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_BYTE){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&dwAccessByte)){
+ temporary[0]=byteData;
+ temporary[1]=0;
+ sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,byteData,byteData,temporary);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ lptv->item.iImage=2;
+ lptv->item.iSelectedImage=2;
+ }
+ TreeView_InsertItem(hVarTree,lptv);
+}
+void VarList_Member(HWND hVarTree,HTREEITEM hParent,DWORD pTopOffset,CClass *pobj_c,BOOL bPtr){
+ int i,i2;
+ char VarData[VN_SIZE],VarName[VN_SIZE];
+ TV_INSERTSTRUCT tv;
+
+ memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+ tv.hInsertAfter=TVI_LAST;
+ tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+ tv.hParent=hParent;
+ tv.item.pszText=VarData;
+
+ for(i=0;iiMemberNum;i++){
+ if(bPtr){
+ lstrcpy(VarName,"->");
+ lstrcat(VarName,pobj_c->ppobj_Member[i]->name);
+ }
+ else{
+ lstrcpy(VarName,".");
+ lstrcat(VarName,pobj_c->ppobj_Member[i]->name);
+ }
+
+ LONG_PTR offset;
+ offset=GetSizeOfClassMember(pobj_c,pobj_c->ppobj_Member[i]->name,&i2);
+
+ if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
+ //構造体内の配列
+ sprintf(VarData,"%s %s(&H%X)",VarName,STRING_ARRAY,pTopOffset+offset);
+ tv.item.iImage=0;
+ tv.item.iSelectedImage=0;
+ hParent=TreeView_InsertItem(hVarTree,&tv);
+
+ VarList_Array(hVarTree,hParent,
+ pTopOffset+offset,
+ pobj_c->ppobj_Member[i]->TypeInfo.type,
+ pobj_c->ppobj_Member[i]->SubScripts,
+ pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
+ }
+ else{
+ //メンバ変数
+ VarList_Insert(hVarTree,
+ &tv,
+ VarName,
+ pobj_c->ppobj_Member[i]->TypeInfo.type,
+ pTopOffset+offset,
+ pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
+ }
+ }
+}
+int VarList_Array(HWND hVarTree,HTREEITEM hParent,DWORD offset,int type,int *SubScripts,LONG_PTR lpIndex){
+ int i,i2,i3,ElementNum,MemCounter,UseCount[255],TypeSize;
+ char temporary[VN_SIZE],temp2[DIGIT_SIZE];
+
+ TV_INSERTSTRUCT tv;
+ memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+ tv.hInsertAfter=TVI_LAST;
+ tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+ tv.hParent=hParent;
+ tv.item.pszText=temporary;
+
+ TypeSize=GetTypeSize(type,lpIndex);
+
+ for(i=0;i<255;i++){
+ if(SubScripts[i]==-1) break;
+ UseCount[i]=0;
+ }
+ UseCount[i]=-2;
+ MemCounter=0;
+ while(1){
+ UseCount[i]++;
+ for(ElementNum=0;SubScripts[i-ElementNum]ScopeLevel!=0){
+ if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[0] &&
+ pobj_dti->lplpObp[0] < rva_to_real(pVar->ScopeEndAddress)){
+ //範囲内
+ }
+ else{
+ //範囲外
+ continue;
+ }
+ }
+
+ if(!pobj_nv->bShow_DefaultSystem_Var){
+ if(memcmp(pVar->name,"_System_",8)==0||
+ memcmp(pVar->name,"_DebugSys_",10)==0||
+ memcmp(pVar->name,"_PromptSys_",11)==0) continue;
+ }
+ if(!pobj_nv->bShow_Rad_Var){
+ if(memcmp(pVar->name,"_RadSys_",8)==0) continue;
+ }
+ if(!pobj_nv->bShow_GUID_Var){
+ if(memcmp(pVar->name,"GUID_",5)==0||
+ memcmp(pVar->name,"IID_",4)==0||
+ memcmp(pVar->name,"CLSID_",6)==0) continue;
+ }
+
+ //静的メンバ
+ if(strstr(pVar->name,".")) continue;
+
+ if(pVar->bArray){
+ sprintf(temporary,"%s %s(&H%X)",
+ pVar->name,
+ STRING_ARRAY,
+ ImageBase+MemPos_RWSection+pVar->offset);
+ tv.item.iImage=0;
+ tv.item.iSelectedImage=0;
+ hParent=TreeView_InsertItem(hVarTree_Global,&tv);
+
+ VarList_Array(hVarTree_Global,hParent,
+ ImageBase+MemPos_RWSection+pVar->offset,
+ pVar->type,
+ pVar->SubScripts,
+ pVar->u.index);
+ }
+ else{
+ VarList_Insert(hVarTree_Global,
+ &tv,
+ pVar->name,
+ pVar->type,
+ ImageBase+MemPos_RWSection+pVar->offset,
+ pVar->u.index);
+ }
+ }
+}
+void RefreshLocalVar(void){
+ int i,i2,i3,sw;
+ char temporary[VN_SIZE];
+ TV_INSERTSTRUCT tv;
+ HTREEITEM hParent;
+ ULONG_PTR lpData;
+ LONG_PTR offset;
+ ULONG_PTR lpAccBytes;
+
+ TreeView_DeleteAllItems(hVarTree_Local);
+
+ memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+ tv.hInsertAfter=TVI_LAST;
+ tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+ tv.hParent=TVI_ROOT;
+ tv.item.pszText=temporary;
+
+ extern HANDLE hDebugProcess;
+ extern HWND hDebugWnd;
+ i2=SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+ i2=pobj_dti->iProcLevel-i2;
+
+ if(pobj_dti->lplpSpBase[i2]==0) return;
+
+ extern SUBINFO **ppSubHash;
+ SUBINFO *psi;
+ for(i3=0,sw=0;i3CompileAddress) <= pobj_dti->lplpObp[i2] &&
+ pobj_dti->lplpObp[i2] < rva_to_real(psi->EndOpAddr)){
+ sw=1;
+ break;
+ }
+
+ psi=psi->pNextData;
+ }
+ if(sw) break;
+ }
+ if(!psi) return;
+
+ for(i=0;iVarNum;i++){
+ VARIABLE *pVar=&psi->pVar[i];
+
+ //スコープ外の場合は無視
+ if(pVar->ScopeLevel!=0){
+ if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[i2] &&
+ pobj_dti->lplpObp[i2] < rva_to_real(pVar->ScopeEndAddress)){
+ //範囲内
+ }
+ else{
+ //範囲外
+ continue;
+ }
+ }
+
+ if(pVar->bArray){
+ sprintf(temporary,"%s %s(&H%X)",
+ pVar->name,
+ STRING_ARRAY,
+ pobj_dti->lplpSpBase[i2]+pVar->offset);
+ tv.item.iImage=0;
+ tv.item.iSelectedImage=0;
+ hParent=TreeView_InsertItem(hVarTree_Local,&tv);
+
+ VarList_Array(hVarTree_Local,hParent,
+ pobj_dti->lplpSpBase[i2]+pVar->offset,
+ pVar->type,
+ pVar->SubScripts,
+ pVar->u.index);
+ }
+ else{
+ offset=pobj_dti->lplpSpBase[i2]+pVar->offset;
+ if(pVar->fRef){
+ ReadProcessMemory(hDebugProcess,(void *)offset,&lpData,sizeof(ULONG_PTR),&lpAccBytes);
+ offset=lpData;
+ }
+ VarList_Insert(hVarTree_Local,&tv,
+ pVar->name,
+ pVar->type,
+ offset,
+ pVar->u.index);
+ }
+ }
+
+
+
+ /////////////////////////////
+ // Thisオブジェクトのリスト
+ /////////////////////////////
+
+ TreeView_DeleteAllItems(hVarTree_This);
+ if(!psi->pobj_ParentClass) return;
+
+ //Thisポインタを取得
+ LONG_PTR pThis;
+ for(i=0;iVarNum;i++){
+ if(lstrcmp(psi->pVar[i].name,"_System_LocalThis")==0) break;
+ }
+ if(i==psi->VarNum) return;
+ lpData=pobj_dti->lplpSpBase[i2]+psi->pVar[i].offset;
+ ReadProcessMemory(hDebugProcess,(void *)lpData,&pThis,sizeof(LONG_PTR),&lpAccBytes);
+
+ for(i=0;ipobj_ParentClass->iMemberNum;i++){
+ offset=GetSizeOfClassMember(psi->pobj_ParentClass,psi->pobj_ParentClass->ppobj_Member[i]->name,&i2);
+
+ if(psi->pobj_ParentClass->ppobj_Member[i]->SubScripts[0]!=-1){
+ //配列
+ sprintf(temporary,"%s %s(&H%X)",
+ psi->pobj_ParentClass->ppobj_Member[i]->name,
+ STRING_ARRAY,
+ offset);
+ tv.item.iImage=0;
+ tv.item.iSelectedImage=0;
+ hParent=TreeView_InsertItem(hVarTree_This,&tv);
+
+ VarList_Array(hVarTree_This,hParent,
+ pThis+offset,
+ psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.type,
+ psi->pobj_ParentClass->ppobj_Member[i]->SubScripts,
+ psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.u.lpIndex);
+ }
+ else{
+ VarList_Insert(hVarTree_This,&tv,
+ psi->pobj_ParentClass->ppobj_Member[i]->name,
+ psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.type,
+ pThis+offset,
+ psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.u.lpIndex);
+ }
+ }
+}
+void RefreshGlobalVar_with_WindowLock(void){
+ extern HWND hDebugWnd;
+
+ //処理時間を短くするため、一時的に非表示にする
+ LockWindowUpdate(hDebugWnd);
+ ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
+
+ //リフレッシュ
+ RefreshGlobalVar();
+
+ LockWindowUpdate(NULL);
+ ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
+}
+void RefreshLocalVar_with_WindowLock(void){
+ extern HWND hDebugWnd;
+
+ //処理時間を短くするため、一時的に非表示にする
+ LockWindowUpdate(hDebugWnd);
+ ShowWindow(GetParent(hVarTree_Local),SW_HIDE);
+
+ //リフレッシュ
+ RefreshLocalVar();
+
+ LockWindowUpdate(NULL);
+ ShowWindow(GetParent(hVarTree_Local),SW_SHOW);
+}
+
+void SetCalcToWatchList(HWND hListView,int iItem,char *buffer){
+ int i;
+ char temporary[255],temp2[255];
+
+ //エスケープシーケンスをセット
+ SetEscapeSequenceFormat(buffer);
+
+ //ブランクを除去
+ KillStringSpaces(buffer);
+
+ //カッコを相互チェック
+ if(!CheckParenthesis2(buffer)){
+ ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
+ return;
+ }
+
+ double dbl;
+ _int64 i64data;
+ i=StaticCalculation(true, buffer,0,&i64data,0,1);
+ if(IsRealNumberType(i)){
+ memcpy(&dbl,&i64data,sizeof(double));
+ }
+
+ if(i==0){
+ ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
+ }
+ else if(i==-1){
+ ListView_SetItemText(hListView,iItem,1,STRING_CANNOTACCESS);
+ }
+ else{
+ if(IsRealNumberType(i))
+ sprintf(temporary,"%.15g (&H%08X)",dbl,(int)dbl);
+ else if(Is64Type(i)){
+ _i64toa(i64data,temporary,10);
+ _i64toa(i64data,temp2,16);
+ CharUpper(temp2);
+ sprintf(temporary+lstrlen(temporary)," (&H%s)",temp2);
+ }
+ else sprintf(temporary,"%d (&H%08X)",(long)i64data,(long)i64data);
+
+ ListView_SetItemText(hListView,iItem,1,temporary);
+ }
+}
+void RefreshWatchList(void){
+ extern HWND hDebugWnd;
+ HWND hListView;
+ int i,i2;
+ char temporary[VN_SIZE];
+
+ hListView=GetDlgItem(hDebugWnd,IDC_WATCHLIST);
+ i2=ListView_GetItemCount(hListView);
+ for(i=0;iiProcLevel+1;i3++){
+ for(i2=0;i2lplpObp[i3]&&
+ pobj_dti->lplpObp[i3]<=(pLineInfo[i2+1].TopObp+ImageBase+MemPos_CodeSection)) break;
+ }
+ if(i2==MaxLineInfoNum) pobj_dti->lpdwCp[i3]=-1;
+ else{
+ pobj_dti->lpdwCp[i3]=pLineInfo[i2].TopCp;
+ }
+ }
+ for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
+ if(pobj_dti->lpdwCp[i3]==-1){
+ pobj_dti->iProcLevel--;
+ for(i2=i3;i2<(int)pobj_dti->iProcLevel+1;i2++){
+ pobj_dti->lplpObp[i2]=pobj_dti->lplpObp[i2+1];
+ pobj_dti->lplpSpBase[i2]=pobj_dti->lplpSpBase[i2+1];
+ pobj_dti->lpdwCp[i2]=pobj_dti->lpdwCp[i2+1];
+ }
+ i3--;
+ continue;
+ }
+ }
+
+ if(!GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel],&i2,temporary)){
+ extern HWND hMainDlg;
+ //"デバッグ情報の取得に失敗"
+ MessageBox(hMainDlg,STRING_DEBUG_FAILED,"ActiveBasic error",MB_OK);
+ return 0;
+ }
+ ShowErrorLine(i2,temporary);
+
+ //プロシージャ コンボボックス
+ extern SUBINFO **ppSubHash;
+ SUBINFO *psi;
+ int sw;
+ SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
+ for(i2=pobj_dti->iProcLevel;i2>=0;i2--){
+ for(i3=0,sw=0;i3CompileAddress) <= pobj_dti->lplpObp[i2] &&
+ pobj_dti->lplpObp[i2] < rva_to_real(psi->EndOpAddr)){
+ lstrcpy(temporary,psi->name);
+ sw=1;
+ break;
+ }
+ psi=psi->pNextData;
+ }
+ if(sw) break;
+ }
+ if(!psi){
+ if(i2==0){
+ lstrcpy(temporary,"Global");
+ pobj_dti->lplpSpBase[i2]=0;
+ }
+ else lstrcpy(temporary,"error");
+ }
+ SendMessage(hProcCombo,CB_ADDSTRING,0,(long)temporary);
+ }
+ SendMessage(hProcCombo,CB_SETCURSEL,0,0);
+
+ return pobj_dti->iProcLevel;
+}
+
+//IDC_THREADCOMBOプロシージャ
+LRESULT CALLBACK ThreadComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern WNDPROC OldThreadComboProc;
+ int i2;
+ DWORD dwThreadID;
+ char temporary[255];
+
+ switch(message){
+ case WM_COMMAND:
+ if(HIWORD(wParam)==CBN_SELCHANGE){
+ SendMessage(hwnd,CB_GETLBTEXT,SendMessage(hwnd,CB_GETCURSEL,0,0),(long)temporary);
+ sscanf(temporary+2,"%X",&dwThreadID);
+
+ i2=0;
+ while(_DebugSys_dwThreadID[i2]!=dwThreadID) i2++;
+
+ //次回のステップ実行対象を指定
+ extern int NextStepThreadNum;
+ NextStepThreadNum=i2;
+
+ //スレッド情報をリフレッシュ
+ pobj_dti->Reflesh(i2);
+
+ SetDebugProcCombo(GetDlgItem(GetParent(hwnd),IDC_PROCCOMBO));
+
+ SendDlgItemMessage(GetParent(hwnd),IDC_PROCCOMBO,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
+ }
+ break;
+ }
+ return CallWindowProc(OldThreadComboProc,hwnd,message,wParam,lParam);
+}
+//IDC_PROCCOMBOプロシージャ
+LRESULT CALLBACK ProcComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern WNDPROC OldProcComboProc;
+ int i2,i3;
+ char temporary[MAX_PATH];
+
+ switch(message){
+ case WM_COMMAND:
+ if(HIWORD(wParam)==CBN_SELCHANGE){
+ i2=SendMessage(hwnd,CB_GETCURSEL,0,0);
+ GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel-i2],&i3,temporary);
+ ShowErrorLine(i3,temporary);
+
+ RefreshLocalVar_with_WindowLock();
+ }
+ break;
+ }
+ return CallWindowProc(OldProcComboProc,hwnd,message,wParam,lParam);
+}
+void InitVarList(DWORD dwThreadId){
+ extern HWND hDebugWnd;
+ int i2,i3,i5;
+ char temporary[255];
+
+
+ //スレッド
+ SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_RESETCONTENT,0,0);
+ extern DWORD _DebugSys_dwThreadID[256];
+ for(i2=0;i2<256;i2++){
+ if(_DebugSys_dwThreadID[i2]){
+ sprintf(temporary,"&H%08X",_DebugSys_dwThreadID[i2]);
+ SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_ADDSTRING,0,(LPARAM)temporary);
+ if(_DebugSys_dwThreadID[i2]==dwThreadId){
+ extern int NextStepThreadNum;
+ NextStepThreadNum=i2;
+ }
+ }
+ }
+ sprintf(temporary,"&H%08X",dwThreadId);
+ i5=(int)SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_FINDSTRING,0,(LPARAM)temporary);
+ SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_SETCURSEL,i5,0);
+
+ i2=SetDebugProcCombo(GetDlgItem(hDebugWnd,IDC_PROCCOMBO));
+
+
+ ///////////////////////////////////////////////
+ // 実行中のプロシージャのローカル変数をセット
+ ///////////////////////////////////////////////
+
+ extern VARIABLE *LocalVar;
+ extern int MaxLocalVarNum;
+ int sw;
+
+ MaxLocalVarNum=0;
+ pobj_CompilingClass=0;
+
+ i2=SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+ i2=pobj_dti->iProcLevel-i2;
+
+ if(pobj_dti->lplpSpBase[i2]){
+ extern SUBINFO **ppSubHash;
+ SUBINFO *psi;
+ for(i3=0,sw=0;i3CompileAddress) <= pobj_dti->lplpObp[i2] &&
+ pobj_dti->lplpObp[i2] < rva_to_real(psi->EndOpAddr)){
+ sw=1;
+ break;
+ }
+
+ psi=psi->pNextData;
+ }
+ if(sw) break;
+ }
+
+
+ if(psi){
+ LocalVar=psi->pVar;
+ MaxLocalVarNum=psi->VarNum;
+
+ pobj_CompilingClass=psi->pobj_ParentClass;
+ }
+ }
+
+
+ ////////////////////////
+ // 変数リストを再表示
+ ////////////////////////
+
+ //処理時間を短くするため、一時的に非表示にする
+ LockWindowUpdate(hDebugWnd);
+ ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
+ ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_HIDE);
+
+ //リフレッシュ
+ RefreshLocalVar();
+ RefreshGlobalVar();
+ RefreshWatchList();
+
+ LockWindowUpdate(NULL);
+ ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
+ ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_SHOW);
+}
+
+
+
+
+//////////////////////////////////////
+// エディタに埋め込み表示のデバッガ
+//////////////////////////////////////
+
+BOOL CALLBACK DebuggerButtonsProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern HINSTANCE hInst;
+ extern DWORD dwStepRun;
+
+ //デバッガ用ツールバー
+#define BMPNUM_DEBUGGERTOOLBAR 3
+#define BTNNUM_DEBUGGERTOOLBAR 4
+ TBBUTTON DebuggerToolBar[]={
+ {0,IDC_DEBUG_START,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+ {0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
+ {1,IDC_DEBUG_STEPOVER,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+ {2,IDC_DEBUG_STEPIN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+ };
+ TOOLTIPTEXT *pTipText;
+
+ static HIMAGELIST hImageList,hImageList_Disabled;
+
+ switch(message){
+ case WM_INITDIALOG:
+ //ツールバーを生成
+ extern HWND hDebuggerToolbar;
+ hDebuggerToolbar=CreateToolbarEx(hwnd,WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|WS_CLIPSIBLINGS,
+ NULL,
+ 0,0,0,
+ DebuggerToolBar,
+ BTNNUM_DEBUGGERTOOLBAR, /*アイテムの個数*/
+ 0,0,16,15,sizeof(TBBUTTON));
+
+ hImageList = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR),
+ 16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
+ SendMessage(hDebuggerToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
+ hImageList_Disabled = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR_DISABLED),
+ 16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
+ SendMessage(hDebuggerToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList_Disabled);
+
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDC_DEBUG_START:
+ DestroyWindow(GetParent(hwnd));
+ return 1;
+ case IDC_DEBUG_STEPIN:
+ Debugger_StepIn();
+ return 1;
+ case IDC_DEBUG_STEPOVER:
+ Debugger_StepOver();
+ return 1;
+ }
+ break;
+ case WM_NOTIFY:
+ pTipText=(TOOLTIPTEXT *)lParam;
+ if(pTipText->hdr.code==TTN_NEEDTEXT){
+ //ツールチップを表示
+ switch(pTipText->hdr.idFrom){
+ case IDC_DEBUG_START:
+ pTipText->lpszText="実行";
+ break;
+ case IDC_DEBUG_STEPOVER:
+ pTipText->lpszText="ステップ アウト";
+ break;
+ case IDC_DEBUG_STEPIN:
+ pTipText->lpszText="ステップ イン";
+ break;
+ }
+ }
+ break;
+ case WM_SIZE:
+ MoveWindow(hDebuggerToolbar,0,0,LOWORD(lParam),HIWORD(lParam),1);
+ return 1;
+
+ case WM_DESTROY:
+ ImageList_Destroy(hImageList);
+ ImageList_Destroy(hImageList_Disabled);
+ return 1;
+ }
+ return 0;
+}
+
+WNDPROC OldTabProc;
+LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern HINSTANCE hInst;
+
+ static HMENU hDummyMenu,hMenu=0;
+
+ switch(message){
+ case WM_CONTEXTMENU:
+ if(hMenu==0){
+ hDummyMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_DEBUGGER_VARLIST_MENU));
+ hMenu=GetSubMenu(hDummyMenu,0);
+ }
+
+ MENUITEMINFO mi;
+ mi.cbSize=sizeof(MENUITEMINFO);
+ mi.fMask=MIIM_STATE;
+ mi.fState=MFS_CHECKED;
+
+ if(pobj_nv->bShow_DefaultSystem_Var)
+ SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
+ if(pobj_nv->bShow_Rad_Var)
+ SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
+ if(pobj_nv->bShow_GUID_Var)
+ SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
+
+ TrackPopupMenu(hMenu,TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+
+ break;
+ case WM_COMMAND:
+ mi.cbSize=sizeof(MENUITEMINFO);
+ mi.fMask=MIIM_STATE;
+ switch(LOWORD(wParam)){
+ case IDM_SHOW_DEFAULTSYSTEM_VAR:
+ if(pobj_nv->bShow_DefaultSystem_Var){
+ pobj_nv->bShow_DefaultSystem_Var=0;
+ mi.fState=MFS_UNCHECKED;
+ }
+ else{
+ pobj_nv->bShow_DefaultSystem_Var=1;
+ mi.fState=MFS_CHECKED;
+ }
+ SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
+ RefreshGlobalVar_with_WindowLock();
+ break;
+ case IDM_SHOW_RAD_VAR:
+ if(pobj_nv->bShow_Rad_Var){
+ pobj_nv->bShow_Rad_Var=0;
+ mi.fState=MFS_UNCHECKED;
+ }
+ else{
+ pobj_nv->bShow_Rad_Var=1;
+ mi.fState=MFS_CHECKED;
+ }
+ SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
+ RefreshGlobalVar_with_WindowLock();
+ break;
+ case IDM_SHOW_GUID_VAR:
+ if(pobj_nv->bShow_GUID_Var){
+ pobj_nv->bShow_GUID_Var=0;
+ mi.fState=MFS_UNCHECKED;
+ }
+ else{
+ pobj_nv->bShow_GUID_Var=1;
+ mi.fState=MFS_CHECKED;
+ }
+ SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
+ RefreshGlobalVar_with_WindowLock();
+ break;
+ }
+ break;
+ case WM_DESTROY:
+ DestroyMenu(hMenu);
+ hMenu=0;
+ break;
+ }
+ return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
+}
+
+BOOL CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern HANDLE hHeap;
+ extern HINSTANCE hInst;
+ extern DWORD dwStepRun;
+ extern double width_ratio_VarList;
+ RECT rect;
+ int i,i2,i3;
+ char temporary[VN_SIZE];
+ LV_DISPINFO *lvinfo;
+ LVITEM ListView_Item;
+
+ static POINT pos_VarList;
+ static POINT pos_WatchList;
+
+ switch(message){
+ case WM_INITDIALOG:
+ extern HWND hDebugWnd;
+ hDebugWnd=hwnd;
+
+ //変数リストの初期位置を取得
+ GetWindowRect(GetDlgItem(hwnd,IDC_VARPOS),&rect);
+ pos_VarList.x=rect.left;
+ pos_VarList.y=rect.top;
+ ScreenToClient(hwnd,&pos_VarList);
+
+ //ウォッチリストの初期位置を取得
+ pos_WatchList.x=pos_VarList.x+(rect.right-rect.left)+LEVER_THICK;
+ pos_WatchList.y=0;
+
+ //ツールバーのベースウィンドウを生成
+ static HWND hBase_ToolBar;
+ hBase_ToolBar=CreateDialog(hInst,MAKEINTRESOURCE(IDD_DEBUGGER_TOOLBARBASE),hwnd,DebuggerButtonsProc);
+ MoveWindow(hBase_ToolBar,50,0,20*BTNNUM_DEBUGGERTOOLBAR,22,1);
+
+ extern WNDPROC OldThreadComboProc;
+ OldThreadComboProc=(WNDPROC)GetWindowLong(GetDlgItem(hwnd,IDC_THREADCOMBO),GWL_WNDPROC);
+ SetWindowLong(GetDlgItem(hwnd,IDC_THREADCOMBO),GWL_WNDPROC,(long)ThreadComboProc);
+
+ extern WNDPROC OldProcComboProc;
+ OldProcComboProc=(WNDPROC)GetWindowLong(GetDlgItem(hwnd,IDC_PROCCOMBO),GWL_WNDPROC);
+ SetWindowLong(GetDlgItem(hwnd,IDC_PROCCOMBO),GWL_WNDPROC,(long)ProcComboProc);
+
+
+ ///////////////////////////
+ // タブコントロールを生成
+ ///////////////////////////
+
+ static HWND hTab;
+ HFONT hFont;
+ hFont=(HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
+ hTab=CreateWindow(WC_TABCONTROL,NULL,
+ WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
+ 0,0,0,0,hwnd,0,hInst,0);
+ SendMessage(hTab,WM_SETFONT,(long)hFont,0);
+ OldTabProc=(WNDPROC)GetWindowLong(hTab,GWL_WNDPROC);
+ SetWindowLong(hTab,GWL_WNDPROC,(long)TabProc);
+
+ //タブを設定
+ TC_ITEM tcItem;
+ tcItem.mask=TCIF_TEXT;
+ tcItem.pszText="グローバル";
+ SendMessage(hTab,TCM_INSERTITEM,0,(LPARAM)&tcItem);
+ tcItem.mask=TCIF_TEXT;
+ tcItem.pszText="ローカル";
+ SendMessage(hTab,TCM_INSERTITEM,1,(LPARAM)&tcItem);
+ tcItem.mask=TCIF_TEXT;
+ tcItem.pszText="This";
+ SendMessage(hTab,TCM_INSERTITEM,2,(LPARAM)&tcItem);
+
+ //グローバル変数リストのツリーを作成
+ hVarTree_Global=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+ WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+ 0,0,0,0,
+ hTab,0,hInst,0);
+
+ //ローカル変数リストのツリーを作成
+ hVarTree_Local=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+ WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+ 0,0,0,0,
+ hTab,0,hInst,0);
+
+ //This変数リストのツリーを作成
+ hVarTree_This=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+ WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+ 0,0,0,0,
+ hTab,0,hInst,0);
+
+ ShowWindow(hVarTree_Global,SW_SHOW);
+
+
+ //イメージリスト読み込み、設定
+ static HIMAGELIST hVariOrderImageList;
+ hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
+ TreeView_SetImageList(hVarTree_Global,hVariOrderImageList,TVSIL_NORMAL);
+ TreeView_SetImageList(hVarTree_Local,hVariOrderImageList,TVSIL_NORMAL);
+ TreeView_SetImageList(hVarTree_This,hVariOrderImageList,TVSIL_NORMAL);
+
+
+ /////////////////////////
+ // ウォッチリスト
+ /////////////////////////
+
+ //コラムの設定
+ static HWND hListView;
+ LV_COLUMN ListView_Column;
+ DWORD dwStyle;
+
+ hListView=GetDlgItem(hwnd,IDC_WATCHLIST);
+ GetClientRect(hListView,&rect);
+ dwStyle=ListView_GetExtendedListViewStyle(hListView);
+ dwStyle|=LVS_EX_FULLROWSELECT;
+ ListView_SetExtendedListViewStyle(hListView,dwStyle);
+
+ ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+ ListView_Column.fmt=LVCFMT_LEFT;
+
+ extern int width_WatchColumn_Expression;
+ ListView_Column.cx=width_WatchColumn_Expression;
+ ListView_Column.pszText="ウォッチ式";
+ ListView_Column.iSubItem=0;
+ ListView_InsertColumn(hListView,0,&ListView_Column);
+
+ extern int width_WatchColumn_Value;
+ ListView_Column.cx=width_WatchColumn_Value;
+ ListView_Column.pszText="値";
+ ListView_Column.iSubItem=1;
+ ListView_InsertColumn(hListView,1,&ListView_Column);
+
+ //アイテムの設定
+ ListView_Item.mask=LVIF_TEXT;
+ ListView_Item.iSubItem=0;
+ for(i=0;iWatchNum;i++){
+ ListView_Item.pszText=pobj_nv->ppWatchStr[i];
+ ListView_Item.iItem=i;
+ ListView_InsertItem(hListView,&ListView_Item);
+ }
+ ListView_Item.pszText="...";
+ ListView_Item.iItem=i;
+ ListView_InsertItem(hListView,&ListView_Item);
+
+
+ ///////////////////////
+ // 変数リストの初期化
+ ///////////////////////
+ InitVarList((DWORD)lParam);
+
+ break;
+ case WM_NOTIFY:
+ NMHDR *hdr;
+ hdr=(NMHDR *)lParam;
+ if(hdr->hwndFrom==hTab&&hdr->code==TCN_SELCHANGE){
+ i=TabCtrl_GetCurSel(hTab);
+
+ if(i==0){
+ //グローバル変数を表示
+ ShowWindow(hVarTree_Global,SW_SHOW);
+ ShowWindow(hVarTree_Local,SW_HIDE);
+ ShowWindow(hVarTree_This,SW_HIDE);
+ }
+ else if(i==1){
+ //ローカル変数を表示
+ ShowWindow(hVarTree_Global,SW_HIDE);
+ ShowWindow(hVarTree_Local,SW_SHOW);
+ ShowWindow(hVarTree_This,SW_HIDE);
+ }
+ else if(i==2){
+ //This変数を表示
+ ShowWindow(hVarTree_Global,SW_HIDE);
+ ShowWindow(hVarTree_Local,SW_HIDE);
+ ShowWindow(hVarTree_This,SW_SHOW);
+ }
+ }
+
+ if(hdr->hwndFrom==hListView){
+ lvinfo=(LV_DISPINFO *)hdr;
+ if(hdr->code==NM_DBLCLK){
+ i2=ListView_GetItemCount(hListView);
+ for(i=0;icode==LVN_BEGINLABELEDIT){
+ hEdit=ListView_GetEditControl(hListView);
+
+ GetWindowText(hEdit,temporary,VN_SIZE);
+ if(lstrcmp(temporary,"...")==0) SetWindowText(hEdit,"");
+ }
+ if(hdr->code==LVN_ENDLABELEDIT){
+ GetWindowText(hEdit,temporary,VN_SIZE);
+ if(temporary[0]=='\0'){
+ if(ListView_GetItemCount(hListView)-1==lvinfo->item.iItem) break;
+
+ //空白入力の場合はそのアイテムを削除する
+ ListView_DeleteItem(hListView,lvinfo->item.iItem);
+ break;
+ }
+ ListView_SetItemText(hListView,lvinfo->item.iItem,0,temporary);
+
+ //演算結果を表示
+ SetCalcToWatchList(hListView,lvinfo->item.iItem,temporary);
+
+ if(lvinfo->item.iItem==ListView_GetItemCount(hListView)-1){
+ //リストアイテムを追加
+ ListView_Item.mask=LVIF_TEXT;
+ ListView_Item.pszText="...";
+ ListView_Item.iItem=lvinfo->item.iItem+1;
+ ListView_Item.iSubItem=0;
+ ListView_InsertItem(hListView,&ListView_Item);
+ }
+ }
+
+ if(hdr->code==LVN_KEYDOWN){
+ LV_KEYDOWN *plvKeydown;
+ plvKeydown=(LV_KEYDOWN *)hdr;
+ if(plvKeydown->wVKey==VK_DELETE){
+ i2=ListView_GetItemCount(hListView);
+ for(i=i2-2;i>=0;i--){
+ if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
+ ListView_DeleteItem(hListView,i);
+ i3=i;
+ }
+ }
+
+ ListView_SetItemState(hListView,i3,LVIS_SELECTED,LVIS_SELECTED);
+ }
+ }
+ }
+ break;
+
+ case WM_SIZE:
+ //変数リストの位置
+ int width_VarList;
+ width_VarList=
+ (int)((double)(LOWORD(lParam)-pos_VarList.x)*width_ratio_VarList);
+
+ MoveWindow(hTab,
+ pos_VarList.x,
+ pos_VarList.y,
+ width_VarList,
+ HIWORD(lParam)-pos_VarList.y,
+ 1);
+
+ GetClientRect(hTab,&rect);
+ TabCtrl_AdjustRect(hTab,FALSE,&rect);
+ rect.left-=2;
+ rect.right++;
+ rect.bottom++;
+
+ MoveWindow(hVarTree_Global,
+ rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+ MoveWindow(hVarTree_Local,
+ rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+ MoveWindow(hVarTree_This,
+ rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+
+ pos_WatchList.x=pos_VarList.x+width_VarList+LEVER_THICK;
+ pos_WatchList.y=0;
+
+ //ウォッチリストの位置
+ MoveWindow(GetDlgItem(hwnd,IDC_WATCHLIST),
+ pos_WatchList.x,
+ pos_WatchList.y,
+ LOWORD(lParam)-pos_WatchList.x,
+ HIWORD(lParam)-pos_WatchList.y,
+ 1);
+
+ return 1;
+
+ case WM_VARLIST_CLOSE:
+ DestroyWindow(hwnd);
+ return 1;
+ case WM_DESTROY:
+ ImageList_Destroy(hVariOrderImageList);
+
+
+ //////////////////////////////////////////////////////////////
+ // ウォッチリストの以前の内容を破棄し、新しい内容に書き換える
+ //////////////////////////////////////////////////////////////
+
+ for(i=0;iWatchNum;i++){
+ HeapDefaultFree(pobj_nv->ppWatchStr[i]);
+ }
+ HeapDefaultFree(pobj_nv->ppWatchStr);
+
+ pobj_nv->WatchNum=ListView_GetItemCount(hListView)-1;
+ pobj_nv->ppWatchStr=(char **)HeapAlloc(hHeap,0,pobj_nv->WatchNum*sizeof(char *)+1);
+ for(i=0;iWatchNum;i++){
+ ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
+ pobj_nv->ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+ lstrcpy(pobj_nv->ppWatchStr[i],temporary);
+ }
+
+
+ //////////////////////////////
+ // デバッグダイアログを破棄
+ //////////////////////////////
+
+ hDebugWnd=0;
+
+ extern BOOL bClipCompileView;
+ if(bClipCompileView){
+ extern HWND hOwnerEditor;
+ SendMessage(hOwnerEditor,WM_DESTROYDEBUGGERVIEW,0,0);
+ }
+
+ return 1;
+
+
+
+ ///////////////////////
+ // デバッグコマンド
+ ///////////////////////
+
+ case WM_DEBUG_CONTINUE:
+ DestroyWindow(hwnd);
+ return 1;
+ case WM_STEP_IN:
+ Debugger_StepIn();
+ return 1;
+ case WM_STEP_OVER:
+ Debugger_StepOver();
+ return 1;
+ case WM_STEP_CURSOR:
+ Debugger_StepCursor();
+ return 1;
+ }
+ return 0;
+}
+
+
+
+
+//////////////////////////////////
+// ポップアップ表示の変数リスト
+//////////////////////////////////
+
+BOOL CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern HANDLE hHeap;
+ extern HINSTANCE hInst;
+ extern DWORD dwStepRun;
+ RECT rect;
+ POINT pos;
+ SIZE size;
+
+ switch(message){
+ case WM_INITDIALOG:
+ extern HWND hDebugWnd;
+ hDebugWnd=hwnd;
+
+ pos.x=pobj_nv->VarDlgRect.left;
+ pos.y=pobj_nv->VarDlgRect.top;
+ size.cx=pobj_nv->VarDlgRect.right-pobj_nv->VarDlgRect.left;
+ size.cy=pobj_nv->VarDlgRect.bottom-pobj_nv->VarDlgRect.top;
+ MoveWindow(hwnd,pos.x,pos.y,size.cx,size.cy,1);
+
+ extern WNDPROC OldThreadComboProc;
+ OldThreadComboProc=(WNDPROC)GetWindowLong(GetDlgItem(hwnd,IDC_THREADCOMBO),GWL_WNDPROC);
+ SetWindowLong(GetDlgItem(hwnd,IDC_THREADCOMBO),GWL_WNDPROC,(long)ThreadComboProc);
+
+ extern WNDPROC OldProcComboProc;
+ OldProcComboProc=(WNDPROC)GetWindowLong(GetDlgItem(hwnd,IDC_PROCCOMBO),GWL_WNDPROC);
+ SetWindowLong(GetDlgItem(hwnd,IDC_PROCCOMBO),GWL_WNDPROC,(long)ProcComboProc);
+
+ //イメージリスト読み込み、設定
+ static HIMAGELIST hVariOrderImageList;
+ hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
+ TreeView_SetImageList(GetDlgItem(hwnd,IDC_VARTREE),hVariOrderImageList,TVSIL_NORMAL);
+
+ InitVarList((DWORD)lParam);
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDCANCEL:
+ DestroyWindow(hwnd);
+ return 1;
+ case IDC_STEPIN:
+ Debugger_StepIn();
+ return 1;
+ case IDC_STEPOVER:
+ Debugger_StepOver();
+ return 1;
+ }
+ break;
+ case WM_SIZE:
+ GetWindowRect(GetDlgItem(hwnd,IDC_VARTREE),&rect);
+ pos.x=rect.left;
+ pos.y=rect.top;
+ ScreenToClient(hwnd,&pos);
+ MoveWindow(GetDlgItem(hwnd,IDC_VARTREE),0,pos.y,LOWORD(lParam),HIWORD(lParam)-pos.y,TRUE);
+ SetWindowPos(GetDlgItem(hwnd,IDCANCEL),0,LOWORD(lParam)-91,9,0,0,SWP_NOSIZE);
+ return 1;
+ case WM_VARLIST_CLOSE:
+ DestroyWindow(hwnd);
+ return 1;
+ case WM_DESTROY:
+ ImageList_Destroy(hVariOrderImageList);
+
+ GetWindowRect(hwnd,&pobj_nv->VarDlgRect);
+
+ hDebugWnd=0;
+
+ return 1;
+ }
+ return 0;
+}
Index: /BasicCompiler32/WatchList.cpp
===================================================================
--- /BasicCompiler32/WatchList.cpp (revision 3)
+++ /BasicCompiler32/WatchList.cpp (revision 3)
@@ -0,0 +1,530 @@
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+//デバッグ用
+#include "../BasicCompiler_Common/debug.h"
+
+int Debugging_GetArray(int *SubScripts,char *array,int type,LONG_PTR lpIndex,LONG_PTR *plpOffset);
+
+ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar){
+ extern DWORD ImageBase;
+ extern int MemPos_RWSection;
+ int i2;
+
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ return ImageBase+MemPos_RWSection+pRelativeVar->offset;
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ extern HWND hDebugWnd;
+ i2=SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+ i2=pobj_dti->iProcLevel-i2;
+
+ if(pobj_dti->lplpSpBase[i2]==0) return 0;
+
+ return pobj_dti->lplpSpBase[i2]+pRelativeVar->offset;
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ extern HWND hDebugWnd;
+ i2=SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+ i2=pobj_dti->iProcLevel-i2;
+
+ if(pobj_dti->lplpSpBase[i2]==0) return 0;
+
+ extern HANDLE hDebugProcess;
+ ULONG_PTR lpData;
+ ULONG_PTR lpAccBytes;
+ ReadProcessMemory(hDebugProcess,
+ (void *)(pobj_dti->lplpSpBase[i2]+pRelativeVar->offset),
+ &lpData,
+ sizeof(ULONG_PTR),
+ &lpAccBytes);
+
+ return lpData;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+ return pRelativeVar->offset;
+ }
+
+ return 0;
+}
+
+BOOL Debugging_SetRelativeOffset(int *pType,LONG_PTR lpIndex,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
+ int array_num;
+
+ _int64 i64data;
+ int type;
+ type=StaticCalculation(true, lpPtrOffset,0,&i64data,0,1);
+ if(!type) return 0;
+ if(IsRealNumberType(type)){
+ double dbl;
+ memcpy(&dbl,&i64data,sizeof(double));
+ i64data=(_int64)dbl;
+ }
+
+ array_num=(int)i64data;
+
+ if(PTR_LEVEL(*pType)){
+ *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1);
+ if((*pType)==DEF_OBJECT)
+ array_num*=GetSizeOfClass((CClass *)lpIndex);
+ else
+ array_num*=GetTypeSize(*pType,-1);
+ }
+ else{
+ //エラー
+ return 0;
+ }
+
+ extern HANDLE hDebugProcess;
+ ULONG_PTR lpData;
+ ULONG_PTR lpAccBytes;
+ lpData=Debugging_GetVarPtr(pRelativeVar);
+ if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&lpAccBytes)) return 0;
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ pRelativeVar->offset+=array_num;
+ return 1;
+}
+
+BOOL Debugging_GetMember(CClass *pobj_c,char *member,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpNestIndex,BOOL bPrivateAccess){
+ int i,i2,offset;
+
+ //直接参照に切り替え
+ pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ //クラス、配列の構成要素を解析する
+ char VarName[VN_SIZE]; //変数名
+ char array[VN_SIZE]; //第1次配列
+ char lpPtrOffset[VN_SIZE]; //第2次配列
+ char NestMember[VN_SIZE]; //入れ子メンバ
+ int RefType; //"."参照のときは0、"->"参照のときは1
+ lstrcpy(VarName,member);
+ if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
+
+
+ ////////////////////////////
+ // メンバオフセットを取得
+ ////////////////////////////
+
+ offset=GetSizeOfClassMember(pobj_c,VarName,&i);
+ if(i==pobj_c->iMemberNum) return 0;
+
+
+ //アクセシビリティをチェック
+ if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
+ pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
+ return 0;
+ }
+ else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED)
+ return 0;
+
+ *pType=pobj_c->ppobj_Member[i]->TypeInfo.type;
+ *plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
+
+ //ポインタ変数の場合
+ if(IsPtrType(*pType)){
+ if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
+ lstrcpy(lpPtrOffset,array);
+ array[0]=0;
+ }
+ }
+ else{
+ if(lpPtrOffset[0]) return 0;
+ }
+
+ pRelativeVar->offset+=offset;
+
+ if(array[0]){
+ //配列オフセット
+ i2=Debugging_GetArray(
+ pobj_c->ppobj_Member[i]->SubScripts,
+ array,
+ *pType,
+ pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex,
+ &pRelativeVar->offset);
+ if(i2==0){
+ //式エラー
+ return 0;
+ }
+ if(i2==-1){
+ //アクセスエラー
+ return -1;
+ }
+ }
+ else if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
+ *pType|=FLAG_PTR;
+ }
+
+ if(NestMember[0]){
+ //入れ子構造の場合
+
+ if(*pType==DEF_OBJECT){
+ if(RefType!=DEF_OBJECT) return 0;
+ }
+ else if(*pType==DEF_PTR_OBJECT){
+ //構造体ポインタ型メンバ変数
+
+ if(lpPtrOffset[0]){
+ if(RefType!=DEF_OBJECT) return 0;
+
+ //直接参照に切り替え
+ Debugging_SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
+
+ lpPtrOffset[0]=0;
+ }
+ else{
+ if(RefType!=DEF_PTR_OBJECT) return 0;
+
+ extern HANDLE hDebugProcess;
+ ULONG_PTR lpData;
+ ULONG_PTR lpAccBytes;
+ lpData=Debugging_GetVarPtr(pRelativeVar);
+ if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&lpAccBytes)) return -1;
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+ }
+ }
+
+ i2=Debugging_GetMember(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
+ NestMember,
+ pType,
+ pRelativeVar,
+ plpNestIndex,
+ 0);
+ if(i2==0){
+ //式エラー
+ return 0;
+ }
+ if(i2==-1){
+ //アクセスエラー
+ return -1;
+ }
+ }
+
+ if(lpPtrOffset[0]){
+ Debugging_SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
+ }
+
+ return 1;
+}
+int Debugging_GetArray(int *SubScripts,char *array,int type,LONG_PTR lpIndex,LONG_PTR *plpOffset){
+ extern HANDLE hHeap;
+ int i,i2,i3,i4,i5,array_offset,TypeSize;
+ char temporary[VN_SIZE],*pParm[MAX_PARMS];
+
+ for(i=0,i2=0,i3=0;;i++,i2++){
+ if(array[i]=='('){
+ i4=GetStringInPare(temporary+i2,array+i);
+ i+=i4-1;
+ i2+=i4-1;
+ continue;
+ }
+ if(array[i]=='['){
+ i4=GetStringInBracket(temporary+i2,array+i);
+ i+=i4-1;
+ i2+=i4-1;
+ continue;
+ }
+ if(array[i]==','||array[i]=='\0'){
+ if(SubScripts[i3]==-1){
+ for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+ return 0;
+ }
+
+ temporary[i2]=0;
+
+ pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+ lstrcpy(pParm[i3],temporary);
+
+ i3++;
+
+ if(array[i]=='\0'){
+ if(SubScripts[i3]!=-1){
+ for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+ return 0;
+ }
+ break;
+ }
+
+ i2=-1;
+ continue;
+ }
+ temporary[i2]=array[i];
+ }
+
+ array_offset=0;
+
+ for(i=i3-1;i>=0;i--){
+ _int64 i64data;
+ i2=StaticCalculation(true, pParm[i],0,&i64data,0,1);
+ if(i2==0){
+ //式エラー
+ return 0;
+ }
+ if(i2==-1){
+ //アクセスエラー
+ return -1;
+ }
+ if(IsRealNumberType(i2)){
+ double dbl;
+ memcpy(&dbl,&i64data,sizeof(double));
+ i64data=(_int64)dbl;
+ }
+ i5=(int)i64data;
+
+ for(i2=i+1,i4=1;i2VarNum;i++){
+ if(lstrcmp(psi->pVar[i].name,"_System_LocalThis")==0) break;
+ }
+ if(i==psi->VarNum) return 0;
+
+ return psi->pVar[i].offset;
+}
+int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
+ extern HANDLE hDebugProcess;
+ int i,i2,i3,RefType;
+ char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
+ ULONG_PTR lpData;
+ ULONG_PTR lpAccBytes;
+
+ lstrcpy(VarName,variable);
+ GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType);
+
+ LONG_PTR lpIndex;
+ int *pSubScripts;
+ BOOL bArray;
+
+
+ /////////////////
+ // ローカル変数
+ /////////////////
+ extern VARIABLE *LocalVar;
+ extern int MaxLocalVarNum;
+ for(i=0;ioffset=LocalVar[i].offset;
+ if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL;
+ else pRelativeVar->dwKind=VAR_LOCAL;
+ *pType=LocalVar[i].type;
+ lpIndex=LocalVar[i].u.index;
+ *plpIndex=lpIndex;
+ bArray=LocalVar[i].bArray;
+ pSubScripts=LocalVar[i].SubScripts;
+ }
+ else{
+ if(pobj_CompilingClass){
+ ///////////////////////
+ // クラスメンバの参照
+ ///////////////////////
+
+ if(_memicmp(variable,"This.",5)==0){
+ //Thisオブジェクトのメンバを参照するとき
+ SlideString(variable+5,-5);
+ lstrcpy(VarName,variable);
+ }
+ else{
+ //クラス内メンバを参照するとき(通常)
+
+ for(i=0;iiMemberNum;i++){
+ if(lstrcmp(VarName,pobj_CompilingClass->ppobj_Member[i]->name)==0) break;
+ }
+ if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
+ }
+
+ /////////////////////////////
+ // thisポインタを取得
+
+ extern HWND hDebugWnd;
+ i2=SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+ i2=pobj_dti->iProcLevel-i2;
+
+ lpData=Debugging_GetThisPtrOffset(pobj_dti->lplpObp[i2]);
+ lpData+=pobj_dti->lplpSpBase[i2];
+ if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(ULONG_PTR),&lpAccBytes)){
+ //メモリにアクセスできないとき
+ return -1;
+ }
+
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ LONG_PTR lp2;
+ i3=Debugging_GetMember(pobj_CompilingClass,variable,pType,pRelativeVar,&lp2,1);
+ if(i3==0){
+ //式エラー
+ return 0;
+ }
+ if(i3==-1){
+ //アクセスエラー
+ return -1;
+ }
+
+ *plpIndex=lp2;
+ return 1;
+ }
+
+NonClassMember:
+
+
+ ///////////////////
+ // グローバル変数
+ ///////////////////
+ extern VARIABLE *GlobalVar;
+ extern int MaxGlobalVarNum;
+
+ for(i=0;ioffset=GlobalVar[i].offset;
+ pRelativeVar->dwKind=VAR_GLOBAL;
+ *pType=GlobalVar[i].type;
+ lpIndex=GlobalVar[i].u.index;
+ *plpIndex=lpIndex;
+ bArray=GlobalVar[i].bArray;
+ pSubScripts=GlobalVar[i].SubScripts;
+ }
+
+
+ if(array[0]==0&&bArray){
+ //配列の先頭ポインタを示す場合
+ *pType|=FLAG_PTR;
+ if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
+ return 1;
+ }
+
+ if(array[0]){
+ i3=Debugging_GetArray(pSubScripts,array,*pType,lpIndex,&pRelativeVar->offset);
+ if(i3==0){
+ //式エラー
+ return 0;
+ }
+ if(i3==-1){
+ //アクセスエラー
+ return -1;
+ }
+ }
+ if(member[0]){
+ if(*pType==DEF_OBJECT){
+ //実態オブジェクトのメンバを参照(obj.member)
+ if(RefType!=DEF_OBJECT){
+ return 0;
+ }
+
+ LONG_PTR lp2;
+ i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
+ if(i3==0){
+ //式エラー
+ return 0;
+ }
+ if(i3==-1){
+ //アクセスエラー
+ return -1;
+ }
+
+ *plpIndex=lp2;
+ }
+ else if(*pType==DEF_PTR_OBJECT){
+ //ポインタオブジェクトが示すメンバを参照
+ if(lpPtrOffset[0]){
+ //pObj[n].member
+ if(RefType!=DEF_OBJECT) return 0;
+ Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
+
+ LONG_PTR lp2;
+ i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
+ if(i3==0){
+ //式エラー
+ return 0;
+ }
+ if(i3==-1){
+ //アクセスエラー
+ return -1;
+ }
+
+ *plpIndex=lp2;
+ }
+ else{
+ //pObj->member
+ if(RefType!=DEF_PTR_OBJECT) return 0;
+
+ pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ if(!ReadProcessMemory(hDebugProcess,(void *)pRelativeVar->offset,&lpData,sizeof(ULONG_PTR),&lpAccBytes)) return -1;
+ pRelativeVar->offset=lpData;
+
+ LONG_PTR lp2;
+ i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
+ if(i3==0){
+ //式エラー
+ return 0;
+ }
+ if(i3==-1){
+ //アクセスエラー
+ return -1;
+ }
+
+ *plpIndex=lp2;
+ }
+ }
+ else{
+ return 0;
+ }
+ return 1;
+ }
+
+ if(lpPtrOffset[0]){
+ if(!Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset)) return 0;
+ }
+
+ return 1;
+}
Index: /BasicCompiler32/commandvalue.h
===================================================================
--- /BasicCompiler32/commandvalue.h (revision 3)
+++ /BasicCompiler32/commandvalue.h (revision 3)
@@ -0,0 +1,98 @@
+/* 命令語定数 */
+
+//条件、分岐、繰り返し
+#define COM_DO 0x1021
+/* 0x22は「"」なので使用不可 */
+#define COM_GOTO 0x1023
+#define COM_GOSUB 0x1024
+#define COM_LOOP 0x1026
+#define COM_RETURN 0x1027
+/* 0x28は「(」なので使用不可 */
+/* 0x29は「)」なので使用不可 */
+#define COM_FOR 0x1031
+#define COM_NEXT 0x1032
+#define COM_WHILE 0x1036
+#define COM_WEND 0x1037
+
+//データ操作
+#define COM_DIM 0x1062
+#define COM_LET 0x1066
+#define COM_DELETE 0x1068
+
+//その他
+#define COM_DEBUG 0x1073
+
+//ポインタ
+#define COM_SETDOUBLE 0x10C1
+#define COM_SETSINGLE 0x10C2
+#define COM_SETQWORD 0x10C3
+#define COM_SETDWORD 0x10C4
+#define COM_SETWORD 0x10C5
+#define COM_SETBYTE 0x10C6
+
+
+
+///////////////////////////////////
+// 以下はProjectEditorで使用される
+
+//入出力コマンド
+#define COM_PRINT 0x1150
+#define COM_INPUT 0x1151
+#define COM_OPEN 0x1152
+#define COM_CLOSE 0x1153
+#define COM_FIELD 0x1154
+#define COM_WRITE 0x1155
+
+//条件、分岐、繰り返し
+#define COM_IF 0x1160
+#define COM_SELECT 0x1161
+
+//ファイル操作
+#define COM_CHDIR 0x1170
+#define COM_KILL 0x1171
+#define COM_MKDIR 0x1172
+#define COM_GET 0x1173
+#define COM_PUT 0x1174
+
+//グラフィックス
+#define COM_CIRCLE 0x1180
+#define COM_LINE 0x1181
+#define COM_PAINT 0x1182
+#define COM_PSET 0x1183
+
+//データ操作
+#define COM_CONST 0x1190
+#define COM_TYPEDEF 0x1191
+
+//クラス関連
+#define COM_CLASS 0x1195
+#define COM_PRIVATE 0x1196
+#define COM_PUBLIC 0x1197
+#define COM_INHERITS 0x1198
+#define COM_PROTECTED 0x1199
+#define COM_INTERFACE 0x119A
+
+//その他
+#define COM_BEEP 0x11A0
+#define COM_CLS 0x11A1
+#define COM_COLOR 0x11A2
+#define COM_DECLARE 0x11A4
+#define COM_DEF 0x11A5
+#define COM_END 0x11A6
+#define COM_FUNCTION 0x11A7
+#define COM_LOCATE 0x11A8
+#define COM_RANDOMIZE 0x11A9
+#define COM_REM 0x11AA
+#define COM_SLEEP 0x11AB
+#define COM_SUB 0x11AC
+#define COM_TYPE 0x11AD
+#define COM_VIRTUAL 0x11AE
+#define COM_OVERRIDE 0x11AF
+#define COM_WITH 0x11B0
+#define COM_ENUM 0x11B1
+#define COM_ABSTRACT 0x11B2
+
+//ウィンドウ制御
+#define COM_DELWND 0x11C0
+#define COM_MSGBOX 0x11C1
+#define COM_WINDOW 0x11C2
Index: /BasicCompiler32/increment.cpp
===================================================================
--- /BasicCompiler32/increment.cpp (revision 3)
+++ /BasicCompiler32/increment.cpp (revision 3)
@@ -0,0 +1,427 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+void SetRealVariable(int type,RELATIVE_VAR *pRelativeVar){
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //fstp ptr[ecx+offset]
+ op_fstp_base_offset(type,REG_ECX,(int)pRelativeVar->offset);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ecx,offset
+ op_mov_RV(REG_ECX,(int)pRelativeVar->offset);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+
+ //fstp ptr[ecx]
+ op_fstp_basereg(type,REG_ECX);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //fstp ptr[ebp+ecx+offset]
+ op_fstp_base_offset_ex(type,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //fstp ptr[ebp+offset]
+ op_fstp_base_offset(type,REG_EBP,(int)pRelativeVar->offset);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add ecx,qword ptr[ebp+offset]
+ op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ecx,qword ptr[ebp+offset]
+ op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ goto directmem;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+ //fstp ptr[ecx]
+ op_fstp_basereg(type,REG_ECX);
+ }
+}
+
+void ExtendTypeTo32(int type,int reg);
+void ExtendTypeTo64(int type){
+ if(Is64Type(type)) return;
+
+ ExtendTypeTo32(type,REG_EAX);
+
+ if(IsSignedType(type)){
+ //cdq
+ op_cdq();
+ }
+ else{
+ //xor edx,edx
+ op_zero_reg(REG_EDX);
+ }
+}
+void ExtendTypeTo32(int type,int reg){
+ if(type==DEF_INTEGER){
+ //movsx reg32,reg16
+ op_movsx_R32R16(reg,reg);
+ }
+ else if(type==DEF_WORD){
+ //and reg,0000FFFFh
+ op_and_RV(reg,(int)0x0000FFFF);
+ }
+ else if(type==DEF_CHAR){
+ //movsx reg32,reg8
+ op_movsx_R32R8(reg,reg);
+ }
+ else if(type==DEF_BYTE){
+ //and reg,000000FFh
+ op_and_RV(reg,(int)0xFF);
+ }
+}
+void ExtendTypeTo16(int type,int reg){
+ if(type==DEF_CHAR){
+ //movsx reg16,reg8
+ op_movsx_R16R8(reg,reg);
+ }
+ else if(type==DEF_BYTE){
+ //and reg,000000FFh
+ op_and_RV(reg,(int)0xFF);
+ }
+}
+
+void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative,int reg){
+ if(type==DEF_DOUBLE){
+ //Double型
+
+ }
+ else if(type==DEF_SINGLE){
+ //Single型
+
+ }
+ else{
+ //その他の整数
+
+ if(var_size==sizeof(_int64)){
+ //eaxの値を64ビット(edx:eax)に拡張する
+ ExtendTypeTo64(type);
+ }
+ else if(var_size==sizeof(long)){
+ //レジスタの値を32ビット(eax)に拡張する
+ ExtendTypeTo32(type,reg);
+ }
+ else if(var_size==sizeof(short)){
+ //レジスタの値を16ビット(ax)に拡張する
+ ExtendTypeTo16(type,reg);
+ }
+ //8ビットは拡張なし
+ }
+
+ if(var_size==sizeof(_int64)){
+ //下位32ビット
+ SetWholeVariable(sizeof(long),DEF_LONG,pRelative,REG_EAX);
+
+ //上位32ビット
+ pRelative->offset+=sizeof(long);
+ SetWholeVariable(sizeof(long),DEF_LONG,pRelative,REG_EDX);
+ pRelative->offset-=sizeof(long);
+
+ return;
+ }
+
+ if(pRelative->dwKind==VAR_GLOBAL){
+ if(pRelative->bOffsetOffset){
+ //mov ptr[ecx+offset],eax/ax/al
+ op_mov_MR(var_size,reg,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ptr[offset],eax/ax/al
+ op_mov_MR(var_size,reg,0,(int)pRelative->offset,MOD_DISP32);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelative->dwKind==VAR_LOCAL){
+ if(pRelative->bOffsetOffset){
+ //mov ptr[ebp+ecx+offset],eax/ax/al
+ op_mov_MR_ex(var_size,reg,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ptr[ebp+offset],eax/ax/al
+ op_mov_MR(var_size,reg,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelative->dwKind==VAR_REFLOCAL){
+ if(pRelative->bOffsetOffset){
+ //add ecx,qword ptr[ebp+offset]
+ op_add_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ecx,qword ptr[ebp+offset]
+ op_mov_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ goto directmem;
+ }
+ else if(pRelative->dwKind==VAR_DIRECTMEM){
+directmem:
+
+ //mov ptr[ecx],eax/ax/al
+ op_mov_MR(var_size,reg,REG_ECX,0,MOD_BASE);
+ }
+}
+
+void SetVariableFromReg(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar){
+ /////////////////////////////////////////////////
+ // raxの内容を変数にコピーするコードを抽出
+ /////////////////////////////////////////////////
+
+ if(VarType==DEF_DOUBLE){
+ //Double型変数へスタックの内容を格納する
+ SetRealVariable(VarType,pRelativeVar);
+ }
+ else if(VarType==DEF_SINGLE){
+ //Single型変数へスタックの内容を格納する
+ SetRealVariable(VarType,pRelativeVar);
+ }
+ else{
+ //整数型
+ SetWholeVariable(GetTypeSize(VarType,-1),CalcType,pRelativeVar,REG_EAX);
+ }
+}
+
+
+void IncDec(int idCalc, char *lpszLeft, char *lpszRight){
+ int VarType;
+ LONG_PTR lpVarIndex;
+ RELATIVE_VAR VarRelativeVar;
+
+
+ ///////////////////////////
+ // 変数アドレスを取得
+ ///////////////////////////
+
+ if(!GetVarOffset(
+ 1,
+ lpszLeft,
+ &VarType,
+ &VarRelativeVar,
+ &lpVarIndex)) return;
+
+ if(IsUse_ecx(&VarRelativeVar)){
+ //push ecx
+ op_push(REG_ECX);
+ }
+
+
+ ///////////////////////////////////
+ // レジスタへ変数の内容をコピー
+ ///////////////////////////////////
+
+ if(IsRealNumberType(VarType)){
+ //実数
+ SetReg_RealVariable(VarType,&VarRelativeVar);
+ }
+ else{
+ //整数
+ SetReg_WholeVariable(VarType,&VarRelativeVar,REG_EAX);
+ }
+
+
+ if(IsWholeNumberType(VarType)&&lstrcmp(lpszRight,"1")==0&&
+ (idCalc==CALC_ADDITION||idCalc==CALC_SUBTRACTION)){
+ ////////////////////////////////////////////
+ // 整数型のインクリメント・デクリメント
+ ////////////////////////////////////////////
+
+ if(Is64Type(VarType)){
+ if(idCalc==CALC_ADDITION){
+ //64ビット インクリメント
+
+ //add eax,1
+ op_add_RV8(REG_EAX,1);
+
+ //adc edx,0
+ op_adc_RV8(REG_EDX,0);
+ }
+ else if(idCalc==CALC_SUBTRACTION){
+ //64ビット デクリメント
+
+ //sub eax,1
+ op_sub_RV8(REG_EAX,1);
+
+ //sbb edx,0
+ op_sbb_RV8(REG_EDX,0);
+ }
+ }
+ else{
+ if(idCalc==CALC_ADDITION){
+ //インクリメント
+ op_inc(REG_EAX);
+ }
+ else if(idCalc==CALC_SUBTRACTION){
+ //デクリメント
+ op_dec(REG_EAX);
+ }
+ }
+ }
+ else{
+ //変数オフセットを一時退避
+ //push ecx
+ op_push(REG_ECX);
+
+
+ if(VarType==DEF_DOUBLE){
+ //sub esp,8
+ op_sub_esp(8);
+
+ //fstp qword ptr[esp]
+ op_fstp_basereg(VarType,REG_ESP);
+ }
+ else if(VarType==DEF_SINGLE){
+ //sub esp,4
+ op_sub_esp(4);
+
+ //fstp dword ptr[esp]
+ op_fstp_basereg(VarType,REG_ESP);
+ }
+ else if(Is64Type(VarType)){
+ //push edx
+ op_push(REG_EDX);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else{
+ //push eax
+ op_push(REG_EAX);
+ }
+
+ int CalcType;
+ CalcType=NumOpe(lpszRight,VarType,lpVarIndex,0);
+
+ if(VarType==DEF_DOUBLE) ChangeTypeToDouble(CalcType);
+ else if(VarType==DEF_SINGLE) ChangeTypeToSingle(CalcType);
+ else ChangeTypeToWhole(CalcType,VarType);
+
+ int type[255],sp;
+ LONG_PTR index_stack[255];
+ type[0]=VarType;
+ type[1]=VarType;
+ index_stack[0]=lpVarIndex;
+ index_stack[1]=lpVarIndex;
+ sp=2;
+
+ switch(idCalc){
+ case CALC_XOR:
+ Calc_Xor(type,index_stack,&sp);
+ break;
+ case CALC_OR:
+ Calc_Or(type,index_stack,&sp);
+ break;
+ case CALC_AND:
+ Calc_And(type,index_stack,&sp);
+ break;
+ case CALC_SHL:
+ Calc_SHL(type,&sp);
+ break;
+ case CALC_SHR:
+ Calc_SHR(type,&sp);
+ break;
+ case CALC_ADDITION:
+ case CALC_SUBTRACTION:
+ case CALC_PRODUCT:
+ CalcTwoTerm_Arithmetic(idCalc,type,index_stack,&sp);
+ break;
+ case CALC_MOD:
+ Calc_Mod(type,&sp);
+ break;
+ case CALC_QUOTIENT:
+ Calc_Divide(type,&sp,VarType);
+ break;
+ case CALC_INTQUOTIENT:
+ Calc_IntDivide(type,index_stack,&sp);
+ break;
+ case CALC_POWER:
+ Calc_Power(type,&sp);
+ break;
+ }
+
+
+ if(VarType==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_basereg(VarType,REG_ESP);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else if(VarType==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_basereg(VarType,REG_ESP);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(Is64Type(VarType)){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //pop edx
+ op_pop(REG_EDX);
+ }
+ else{
+ //pop eax
+ op_pop(REG_EAX);
+ }
+
+
+ //変数オフセットを復元
+ //pop ecx
+ op_pop(REG_ECX);
+ }
+
+
+ /////////////////////////////////////////////////
+ // レジスタの内容を変数にコピー
+ /////////////////////////////////////////////////
+
+ if(IsUse_ecx(&VarRelativeVar)){
+ //pop ecx
+ op_pop(REG_ECX);
+ }
+
+ SetVariableFromReg(VarType,VarType,&VarRelativeVar);
+}
Index: /BasicCompiler32/manifest.xml
===================================================================
--- /BasicCompiler32/manifest.xml (revision 3)
+++ /BasicCompiler32/manifest.xml (revision 3)
@@ -0,0 +1,22 @@
+
+
+
+Description
+
+
+
+
+
+
Index: /BasicCompiler32/op32_main.cpp
===================================================================
--- /BasicCompiler32/op32_main.cpp (revision 3)
+++ /BasicCompiler32/op32_main.cpp (revision 3)
@@ -0,0 +1,813 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+
+BOOL IsSafeReg(int reg){
+ if(reg==REG_EBX||reg==REG_ESI||reg==REG_EDI) return 1;
+ return 0;
+}
+
+
+
+/////////////////////////////////////////////////
+// ModR/Mバイト、SIBバイト、ディスプレースメント
+/////////////////////////////////////////////////
+
+//スケール
+#define SCALE_NON (char)0x00
+#define SCALE_2 (char)0x40
+#define SCALE_4 (char)0x80
+#define SCALE_8 (char)0xC0
+
+//インデックスなし
+#define INDEX_NON 0x04
+
+void set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,int disp){
+ if(mod==MOD_DISP32){
+ //ModR/Mバイト
+ OpBuffer[obp++]=(char)( REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(0x04));
+
+ base_reg=0x05;
+ index_reg=INDEX_NON;
+ }
+ else{
+ //ModR/Mバイト
+ OpBuffer[obp++]=(char)(mod | REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(base_reg));
+ }
+
+
+ //レジスタモードの場合は、ここで終了
+ if(mod==MOD_REG) return;
+
+
+ if(REGISTER_OPERAND(base_reg)==0x04||mod==MOD_DISP32){
+ //////////////////////
+ // SIBバイトを使う
+ //////////////////////
+
+ OpBuffer[obp++]=(char)(scale| REGISTER_OPERAND(index_reg)<<3 | REGISTER_OPERAND(base_reg));
+ }
+
+ //ディスプレースメントを必要としない場合は、ここで終了
+ if(mod==MOD_BASE) return;
+
+
+ //////////////////////////
+ // ディスプレースメント
+ //////////////////////////
+
+ if(mod==MOD_BASE_DISP8) OpBuffer[obp++]=(char)disp;
+ else{
+ *((long *)(OpBuffer+obp))=disp;
+ obp+=sizeof(long);
+ }
+}
+
+
+
+void __op_format(char op_prefix,char opcode,int reg){
+ //命令プリフィックス
+ if(op_prefix) OpBuffer[obp++]=op_prefix;
+
+ //オペコード、レジスタ
+ OpBuffer[obp++]=(char)(opcode|REGISTER_OPERAND(reg));
+}
+void __op_format(char op_prefix,char opcode1,char opcode2,int reg,int base_reg,int offset,char mod){
+ //命令プリフィックス
+ if(op_prefix) OpBuffer[obp++]=op_prefix;
+
+ //オペコード
+ OpBuffer[obp++]=opcode1;
+ if(opcode2) OpBuffer[obp++]=opcode2;
+
+ //ModR/M, SIB, disp
+ set_mod_rm_sib_disp(mod,reg,SCALE_NON,INDEX_NON,base_reg,offset);
+}
+
+
+
+///////////////////
+// mov関連
+///////////////////
+
+void op_mov_RV(int reg,int offset){
+ //mov reg,value
+
+ //オペコード、レジスタ
+ OpBuffer[obp++]=(char)(0xB8|REGISTER_OPERAND(reg));
+
+ //DISP32
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+}
+void op_mov_RV(int op_size,int reg,int offset){
+ if(op_size==PTR_SIZE) op_mov_RV(reg,offset);
+ else SetError(300,NULL,cp);
+}
+void op_mov_RR(int reg1,int reg2){
+ //mov reg1,reg2
+
+ if(reg1==reg2) return;
+
+ //1000 1011 11xx xbbb
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+void op_mov_RM(int op_size,int reg,int base_reg,int offset,char mod){
+ //mov reg32,dword ptr[base_reg+offset]
+ //mov reg16,word ptr[base_reg+offset]
+ //mov reg8,byte ptr[base_reg+offset]
+
+ //16ビット演算の命令プリフィックス
+ char op_prefix=0;
+ if(op_size==sizeof(short)) op_prefix=(char)0x66;
+
+ //オペコード
+ char opcode;
+ if(op_size==sizeof(char)) opcode=(char)0x8A;
+ else opcode=(char)0x8B;
+
+ __op_format(op_prefix,opcode,0,reg,base_reg,offset,mod);
+}
+void op_mov_RM_ex(int op_size,int reg,int base_reg1,int base_reg2,int offset,BOOL bUseOffset){
+ //mov reg32,dword ptr[base_reg1+base_reg2+offset]
+ //mov reg16,word ptr[base_reg1+base_reg2+offset]
+ //mov reg8,byte ptr[base_reg1+base_reg2+offset]
+
+ if(base_reg1==REG_ESP){
+ //SIBバイトのindex部にespは指定できない
+ base_reg1=base_reg2;
+ base_reg2=REG_ESP;
+ }
+
+ //16ビット演算のプリフィックス
+ if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66;
+
+ //オペコード
+ if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0x8A;
+ else OpBuffer[obp++]=(char)0x8B;
+
+ if(bUseOffset){
+ ///////////////////////////
+ // オフセット値を使う
+ ///////////////////////////
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0x84| REGISTER_OPERAND(reg)<<3);
+
+ //ベースレジスタ
+ OpBuffer[obp++]=(char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2));
+
+ //オフセット値
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+ else{
+ ///////////////////////////
+ // オフセット値を使わない
+ ///////////////////////////
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0x04| REGISTER_OPERAND(reg)<<3);
+
+ //ベースレジスタ
+ OpBuffer[obp++]=(char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2));
+ }
+}
+void op_mov_MR(int op_size,int reg,int base_reg,int offset,char mod){
+ //mov dword ptr[base_reg+offset],reg32
+ //mov word ptr[base_reg+offset],reg16
+ //mov byte ptr[base_reg+offset],reg8
+
+ //16ビット演算の命令プリフィックス
+ char op_prefix=0;
+ if(op_size==sizeof(short)) op_prefix=(char)0x66;
+
+ //オペコード
+ char opcode;
+ if(op_size==sizeof(char)) opcode=(char)0x88;
+ else opcode=(char)0x89;
+
+ __op_format(op_prefix,opcode,0,reg,base_reg,offset,mod);
+}
+void op_mov_MR_ex(int op_size,int reg,int base_reg1,int base_reg2,int offset,BOOL bUseOffset){
+ //mov dword ptr[base_reg1+base_reg2+offset],reg32
+ //mov word ptr[base_reg1+base_reg2+offset],reg16
+ //mov byte ptr[base_reg1+base_reg2+offset],reg8
+
+ if(base_reg1==REG_ESP){
+ //SIBバイトのindex部にrspは指定できない
+ base_reg1=base_reg2;
+ base_reg2=REG_ESP;
+ }
+
+ //16ビット演算のプリフィックス
+ if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66;
+
+ //オペコード
+ if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0x88;
+ else OpBuffer[obp++]=(char)0x89;
+
+ if(bUseOffset==USE_OFFSET){
+ //////////////////////////
+ //オフセット値を使う
+ //////////////////////////
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0x84| REGISTER_OPERAND(reg)<<3);
+
+ //ベースレジスタ
+ OpBuffer[obp++]=(char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2));
+
+ //オフセット値
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+ else{
+ //////////////////////////
+ //オフセット値を使わない
+ //////////////////////////
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0x04| REGISTER_OPERAND(reg)<<3);
+
+ //ベースレジスタ
+ OpBuffer[obp++]=(char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2));
+ }
+}
+
+
+
+
+////////////////////////////////
+// movsx関連
+////////////////////////////////
+
+void op_movsx_R32R16(int reg32,int reg16){
+ //movsx reg32,reg16
+
+ //16ビット演算の命令プリフィックス
+ char op_prefix=0;
+
+ //オペコード
+ char opcode=(char)0x0F;
+ char opcode2=(char)0xBF;
+
+ __op_format(op_prefix,opcode,opcode2,reg32,reg16,0,MOD_REG);
+}
+void op_movsx_R32R8(int reg32,int reg8){
+ //movsx reg32,reg8
+
+ //16ビット演算の命令プリフィックス
+ char op_prefix=0;
+
+ //オペコード
+ char opcode=(char)0x0F;
+ char opcode2=(char)0xBE;
+
+ __op_format(op_prefix,opcode,opcode2,reg32,reg8,0,MOD_REG);
+}
+void op_movsx_R16R8(int reg16,int reg8){
+ //movsx reg16,reg8
+
+ //16ビット演算の命令プリフィックス
+ char op_prefix=(char)0x66;
+
+ //オペコード
+ char opcode=(char)0x0F;
+ char opcode2=(char)0xBE;
+
+ __op_format(op_prefix,opcode,opcode2,reg16,reg8,0,MOD_REG);
+}
+
+
+
+//////////////////////////////////
+// インクリメント・デクリメント
+//////////////////////////////////
+
+void op_inc(int reg){
+ //inc reg
+
+ //16ビット演算の命令プリフィックス
+ char op_prefix=0;
+
+ //オペコード
+ char opcode=(char)0xFF;
+
+ __op_format(op_prefix,opcode,0,0,reg,0,MOD_REG);
+}
+void op_dec(int reg){
+ op_inc(reg);
+ OpBuffer[obp-1]=OpBuffer[obp-1]|0x08;
+}
+
+
+
+/////////////////////
+// add関連
+/////////////////////
+
+void op_add_RV8(int reg,char cValue){
+ //add reg,value8
+
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)(0xC0|REGISTER_OPERAND(reg));
+ OpBuffer[obp++]=cValue;
+}
+void op_add_RM(int op_size,int reg,int base_reg,int offset,char mod){
+ //add reg32,dword ptr[base_reg+offset]
+ //add reg16,word ptr[base_reg+offset]
+ //add reg8,byte ptr[base_reg+offset]
+
+ //16ビット演算の命令プリフィックス
+ char op_prefix=0;
+ if(op_size==sizeof(short)) op_prefix=(char)0x66;
+
+ //オペコード
+ char opcode;
+ if(op_size==sizeof(char)) opcode=(char)0x02;
+ else opcode=(char)0x03;
+
+ __op_format(op_prefix,opcode,0,reg,base_reg,offset,mod);
+}
+void op_adc_RV8(int reg,char cValue){
+ //adc reg,value8
+
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)(0xD0|REGISTER_OPERAND(reg));
+ OpBuffer[obp++]=cValue;
+}
+
+
+/////////////////////
+// sub関連
+/////////////////////
+
+void op_sub_RV8(int reg,char cValue){
+ //sub reg,value8
+
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)(0xE8|REGISTER_OPERAND(reg));
+ OpBuffer[obp++]=cValue;
+}
+void op_sbb_RV8(int reg,char cValue){
+ //sbb reg,value8
+
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)(0xD8|REGISTER_OPERAND(reg));
+ OpBuffer[obp++]=cValue;
+}
+
+
+
+//////////////////////
+// and関連
+//////////////////////
+
+void op_and_RV(int reg,int value){
+ //and reg,value
+
+ //16ビット演算の命令プリフィックス
+ char op_prefix=0;
+
+ //オペコード
+ char opcode=(char)0x81;
+
+ __op_format(op_prefix,opcode,0,0,reg,value,MOD_REG);
+}
+
+
+
+///////////////////////
+// 64ビット関連
+///////////////////////
+
+void op_cdq(){
+ //cdq
+ OpBuffer[obp++]=(char)0x99;
+}
+
+
+
+/////////////////////
+// ストリング関係
+/////////////////////
+
+void op_rep_movs(int op_size){
+ if(op_size==sizeof(BYTE)){
+ //rep movs byte ptr[edi],byte ptr[esi]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0xA4;
+ }
+ else if(op_size==sizeof(short)){
+ //rep movs word ptr[edi],word ptr[esi]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0xA5;
+ }
+ else if(op_size==sizeof(long)){
+ //rep movs dword ptr[edi],dword ptr[esi]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0xA5;
+ }
+}
+
+
+
+
+//////////////////////////
+// スタック関連
+//////////////////////////
+
+void op_push(int reg){
+ //push reg
+
+ //オペコード、レジスタ
+ __op_format(0,(char)0x50,reg);
+}
+void op_push_value(long data){
+ //スタックにリテラル値をプッシュ
+ if(-128<=data&&data<=127){
+ //push 8ビット値
+ OpBuffer[obp++]=(char)0x6A;
+ OpBuffer[obp++]=(char)data;
+ }
+ else{
+ //push 32ビット値
+ OpBuffer[obp++]=(char)0x68;
+ *((long *)(OpBuffer+obp))=data;
+ obp+=sizeof(long);
+ }
+}
+void op_pop(int reg){
+ //pop reg
+
+ //オペコード、レジスタ
+ __op_format(0,(char)0x58,reg);
+}
+void op_add_esp(int num){
+ //スタックポインタの加算(pop方向)
+
+ //add esp,num
+ if(0xFFFFFF80&num){
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC4;
+ *((long *)(OpBuffer+obp))=num;
+ obp+=sizeof(long);
+ }
+ else{
+ //「128 > num > -127」の場合
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xC4;
+ OpBuffer[obp++]=(char)num;
+ }
+}
+void op_sub_esp(int num){
+ //スタックポインタの減算(push方向)
+
+ //sub esp,num
+ if(0xFFFFFF80&num){
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xEC;
+ *((long *)(OpBuffer+obp))=num;
+ obp+=sizeof(long);
+ }
+ else{
+ //「128 > num > -127」の場合
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xEC;
+ OpBuffer[obp++]=(char)num;
+ }
+}
+
+
+
+////////////////////
+// test関連
+////////////////////
+
+void op_test(int reg1,int reg2){
+ //test reg1,reg2
+
+ //1000 0101 11rr rbbb
+ OpBuffer[obp++]=(char)0x85;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+
+
+
+//////////////////////////////
+// 浮動小数点関連
+//////////////////////////////
+
+void op_fld_ptr_esp(int type){
+ //スタックポインタが示すバッファのデータを浮動小数点レジスタへロード
+
+ if(type==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDD;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(type==DEF_SINGLE){
+ //fld dword ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(type==DEF_INT64){
+ //fild qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x2C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(type==DEF_LONG){
+ //fild dword ptr[esp]
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+ }
+}
+void op_fld_basereg(int type,int base_reg){
+ //fld ptr[reg]
+
+ //オペコード
+ if(type==DEF_DOUBLE) OpBuffer[obp++]=(char)0xDD;
+ else if(type==DEF_SINGLE) OpBuffer[obp++]=(char)0xD9;
+ else SetError(300,NULL,cp);
+
+ if(base_reg==REG_ESP){
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(base_reg==REG_EBP){
+ OpBuffer[obp++]=(char)0x45;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ OpBuffer[obp++]=(char)REGISTER_OPERAND(base_reg);
+ }
+}
+void op_fld_base_offset(int type,int base_reg,int offset){
+ //fld ptr[reg+offset]
+
+ //オペコード
+ if(type==DEF_DOUBLE) OpBuffer[obp++]=(char)0xDD;
+ else if(type==DEF_SINGLE) OpBuffer[obp++]=(char)0xD9;
+ else SetError(300,NULL,cp);
+
+ //オペコード、レジスタ
+ if(base_reg==REG_ESP){
+ OpBuffer[obp++]=(char)0x84;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else{
+ OpBuffer[obp++]=(char)(0x80|REGISTER_OPERAND(base_reg));
+ }
+
+ //オフセット値
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+}
+void op_fld_base_offset_ex(int type,int base_reg1,int base_reg2,int offset,BOOL bUseOffset){
+ //fld ptr[base_reg1+base_reg2+offset]
+
+ if(base_reg1==REG_ESP){
+ //SIBバイトのindex部にespは指定できない
+ base_reg1=base_reg2;
+ base_reg2=REG_ESP;
+ }
+
+ //オペコード
+ if(type==DEF_DOUBLE) OpBuffer[obp++]=(char)0xDD;
+ else if(type==DEF_SINGLE) OpBuffer[obp++]=(char)0xD9;
+ else SetError(300,NULL,cp);
+
+ int reg=0;
+ if(bUseOffset){
+ ///////////////////////////
+ // オフセット値を使う
+ ///////////////////////////
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0x84| REGISTER_OPERAND(reg)<<3);
+
+ //ベースレジスタ
+ OpBuffer[obp++]=(char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2));
+
+ //オフセット値
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+ else{
+ ///////////////////////////
+ // オフセット値を使わない
+ ///////////////////////////
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0x04| REGISTER_OPERAND(reg)<<3);
+
+ //ベースレジスタ
+ OpBuffer[obp++]=(char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2));
+ }
+}
+void op_fstp_basereg(int type,int base_reg){
+ //fstp ptr[reg]
+
+ //オペコード
+ if(type==DEF_DOUBLE) OpBuffer[obp++]=(char)0xDD;
+ else if(type==DEF_SINGLE) OpBuffer[obp++]=(char)0xD9;
+ else SetError(300,NULL,cp);
+
+ if(base_reg==REG_ESP){
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(base_reg==REG_EBP){
+ OpBuffer[obp++]=(char)0x5D;
+ OpBuffer[obp++]=(char)0x00;
+ }
+ else{
+ OpBuffer[obp++]=(char)(0x18|REGISTER_OPERAND(base_reg));
+ }
+}
+void op_fstp_base_offset(int type,int base_reg,int offset){
+ //fstp ptr[reg+offset]
+
+ //オペコード
+ if(type==DEF_DOUBLE) OpBuffer[obp++]=(char)0xDD;
+ else if(type==DEF_SINGLE) OpBuffer[obp++]=(char)0xD9;
+ else SetError(300,NULL,cp);
+
+ //オペコード、レジスタ
+ if(base_reg==REG_ESP){
+ OpBuffer[obp++]=(char)0x9C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else{
+ OpBuffer[obp++]=(char)(0x98|REGISTER_OPERAND(base_reg));
+ }
+
+ //オフセット値
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+}
+void op_fstp_base_offset_ex(int type,int base_reg1,int base_reg2,int offset,BOOL bUseOffset){
+ //fstp ptr[base_reg1+base_reg2+offset]
+
+ if(base_reg1==REG_ESP){
+ //SIBバイトのindex部にespは指定できない
+ base_reg1=base_reg2;
+ base_reg2=REG_ESP;
+ }
+
+ //オペコード
+ if(type==DEF_DOUBLE) OpBuffer[obp++]=(char)0xDD;
+ else if(type==DEF_SINGLE) OpBuffer[obp++]=(char)0xD9;
+ else SetError(300,NULL,cp);
+
+ int reg=0;
+ if(bUseOffset){
+ ///////////////////////////
+ // オフセット値を使う
+ ///////////////////////////
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0x9C| REGISTER_OPERAND(reg)<<3);
+
+ //ベースレジスタ
+ OpBuffer[obp++]=(char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2));
+
+ //オフセット値
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+ else{
+ ///////////////////////////
+ // オフセット値を使わない
+ ///////////////////////////
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0x1C| REGISTER_OPERAND(reg)<<3);
+
+ //ベースレジスタ
+ OpBuffer[obp++]=(char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2));
+ }
+}
+
+
+
+//////////////////////////////
+// レジスタ関連
+//////////////////////////////
+
+void op_zero_reg(int reg){
+ //レジスタに0をセット
+
+ switch(reg){
+ case REG_EAX:
+ //xor eax,eax
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)0xC0;
+ break;
+ case REG_EBX:
+ //xor ebx,ebx
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)0xDB;
+ break;
+ case REG_ECX:
+ //xor ecx,ecx
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)0xC9;
+ break;
+ case REG_EDX:
+ //xor edx,edx
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)0xD2;
+ break;
+ case REG_EBP:
+ //xor ebp,ebp
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)0xED;
+ break;
+ }
+}
+
+void fpu_cast(){
+ ///////////////////////
+ // FPUの切り捨て設定
+ ///////////////////////
+
+ //sub esp,16
+ op_sub_esp(16);
+
+ //mov dword ptr[esp+4],eax
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0x04;
+
+ //fnstcw word ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //mov ax,word ptr[esp]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+
+ //or ah,0Ch
+ OpBuffer[obp++]=(char)0x80;
+ OpBuffer[obp++]=(char)0xCC;
+ OpBuffer[obp++]=(char)0x0C;
+
+ //mov word ptr[esp+2],ax
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x89;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0x02;
+
+ //fldcw word ptr[esp+2]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x6C;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0x02;
+
+ //mov eax,dword ptr[esp+4]
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)0x44;
+ OpBuffer[obp++]=(char)0x24;
+ OpBuffer[obp++]=(char)0x04;
+
+ //add esp,16
+ op_add_esp(16);
+}
+void fpu_cast_end(){
+ //sub esp,16
+ op_sub_esp(16);
+
+ //fldcw word ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x2C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //add esp,16
+ op_add_esp(16);
+}
+
+
+/////////////////////////////
+// 関数呼び出し
+/////////////////////////////
+
+void op_call(SUBINFO *psi){
+ OpBuffer[obp++]=(char)0xE8;
+ pobj_SubAddrSchedule->add(psi,1);
+ psi->bUse=1;
+ obp+=sizeof(long);
+}
Index: /BasicCompiler32/resource.h
===================================================================
--- /BasicCompiler32/resource.h (revision 3)
+++ /BasicCompiler32/resource.h (revision 3)
@@ -0,0 +1,56 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by BasicCompiler.rc
+//
+#define IDD_MAIN 101
+#define IDD_VARLIST 103
+#define IDI_MAIN 108
+#define IDI_VARSTRUCT 109
+#define IDI_VARDATA 110
+#define IDI_VARSTR 111
+#define IDI_VARARRAY 112
+#define IDI_VARPTRSTRUCT 113
+#define IDD_CLIPMAIN 114
+#define IDD_DEBUGGER 115
+#define IDR_DEBUGGERTOOLBAR 117
+#define IDD_DEBUGGER_TOOLBARBASE 120
+#define IDR_DEBUGGER_VARLIST_MENU 122
+#define IDR_DEBUGGERTOOLBAR_DISABLED 125
+#define IDC_EXEPATH 1000
+#define IDC_PROGRESS 1001
+#define IDC_ERRORLIST 1002
+#define IDC_MESSAGE 1003
+#define IDC_DEBUGLIST 1005
+#define IDC_SHOWERROR 1006
+#define IDC_SHOWDEBUG 1007
+#define IDC_THREADCOMBO 1014
+#define IDC_VARTREE 1015
+#define IDC_GLOBAL 1016
+#define IDC_LOCAL 1017
+#define IDC_PROCCOMBO 1018
+#define IDC_HIDESYSVAR 1019
+#define IDC_STEPIN 1021
+#define IDC_STEPOVER 1022
+#define IDC_ESP 1023
+#define IDC_DUMMYCANCEL 1024
+#define IDC_TAB1 1025
+#define IDC_VARPOS 1029
+#define IDC_WATCHLIST 1033
+#define IDC_STATIC_VERSION 1034
+#define IDC_DEBUG_START 40003
+#define IDC_DEBUG_STEPOVER 40004
+#define IDC_DEBUG_STEPIN 40005
+#define IDM_SHOW_DEFAULTSYSTEM_VAR 40007
+#define IDM_SHOW_RAD_VAR 40008
+#define IDM_SHOW_GUID_VAR 40009
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 126
+#define _APS_NEXT_COMMAND_VALUE 40010
+#define _APS_NEXT_CONTROL_VALUE 1035
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
Index: /BasicCompiler64/BasicCompiler.h
===================================================================
--- /BasicCompiler64/BasicCompiler.h (revision 3)
+++ /BasicCompiler64/BasicCompiler.h (revision 3)
@@ -0,0 +1,93 @@
+#include "../BasicCompiler_Common/common.h"
+
+LPSTR BasicFileFilter="プログラム ファイル(*.ab;*.bas;*.abp;*.sbp)\0*.ab;*.bas;*.abp;*sbp\0テキスト ファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*\0\0";
+LPSTR ExeFileFilter="実行可能ファイル(*.exe)\0*.exe\0すべてのファイル(*.*)\0*\0\0";
+
+HINSTANCE hInst;
+HWND hOwnerEditor;
+HWND hMainDlg;
+HWND hDebugWnd;
+HANDLE hHeap;
+int ScreenX,ScreenY;
+WNDPROC OldErrorListProc,OldDebugListProc,OldProgressProc;
+WNDPROC OldThreadComboProc;
+WNDPROC OldProcComboProc;
+unsigned short TypeOfSubSystem;
+BOOL bClipCompileView;
+
+//不揮発性データ(レジストリに保存される)
+CNonVolatile *pobj_nv;
+
+//プログラム情報
+BOOL bCompilingGlobal;
+BOOL bStrict;
+DWORD ImageBase;
+INCLUDEFILEINFO IncludeFileInfo;
+SUBINFO **ppSubHash;
+int SubNum;
+char **ppMacroNames;
+int MacroNum;
+DECLAREINFO **ppDeclareHash;
+CONSTINFO **ppConstHash;
+PROCPTRINFO *pProcPtrInfo;
+int ProcPtrInfoNum;
+
+ERRORINFO *pErrorInfo;
+int ErrorNum;
+int CompileMsgNum;
+int WarningNum;
+BOOL bError;
+char **SynonymErrorWords;
+int SynonymErrorNum;
+BOOL bStopCompile;
+
+//リソース情報
+char ResourceFileName[MAX_PATH];
+RESOURCEDATAINFO *pCursorResourceInfo;
+int CursorResourceNum;
+RESOURCEDATAINFO *pBitmapResourceInfo;
+int BitmapResourceNum;
+RESOURCEDATAINFO *pIconResourceInfo;
+int IconResourceNum;
+char szManifestPath[MAX_PATH];
+int XPManiResourceNum;
+
+//デバッグ
+BOOL bDebugCompile=0;
+BOOL bDebugRun=0;
+BOOL bAttach=0;
+DWORD dwAttachProcessId;
+BOOL bDebugSupportProc;
+BOOL bSystemProc;
+DWORD dwStepRun;
+double width_ratio_VarList=0.3;
+HWND hDebuggerToolbar;
+char szDebugCmdLine[1024];
+char szDebugExeForDll[1024];
+
+//デバッグ用行番号情報
+LINEINFO *pLineInfo;
+int MaxLineInfoNum;
+
+//ウォッチリスト
+int width_WatchColumn_Expression=200;
+int width_WatchColumn_Value=400;
+
+
+//関数ポインタのベース タイプ インデックス(左辺の関数ポインタのパラメータを参考に、オーバーロードを解決)
+LONG_PTR ProcPtr_BaseIndex;
+
+
+int cp;
+
+BOOL bDll;
+
+char *basbuf;
+char *pBaseBuffer;
+
+char BasicSystemDir[MAX_PATH]; //BasicCompiler.exeが存在するディレクトリ
+char BasicCurDir[MAX_PATH]; //コンパイルするファイルが存在するディレクトリ
+char SourceFileName[MAX_PATH]="";
+char OutputFileName[MAX_PATH];
+char szDllName[MAX_PATH];
+char szIncludeDir[MAX_PATH]="";
Index: /BasicCompiler64/BasicCompiler.rc
===================================================================
--- /BasicCompiler64/BasicCompiler.rc (revision 3)
+++ /BasicCompiler64/BasicCompiler.rc (revision 3)
@@ -0,0 +1,412 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// 日本語 resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+#ifdef _WIN32
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+#pragma code_page(932)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_MAIN$(JPN) DIALOG DISCARDABLE 0, 0, 205, 229
+#else
+IDD_MAIN DIALOG DISCARDABLE 0, 0, 205, 229
+#endif
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "ActiveBasic Compiler&Debugger"
+FONT 9, "MS Pゴシック"
+BEGIN
+ DEFPUSHBUTTON "コンパイル",IDOK,148,208,50,14
+ LTEXT "出力先:",IDC_STATIC,7,10,23,8
+ EDITTEXT IDC_EXEPATH,34,7,164,14,ES_AUTOHSCROLL
+ CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",0x0,13,56,
+ 179,14
+ GROUPBOX "進行状況",IDC_STATIC,7,31,191,45
+ LTEXT "準備中...",IDC_MESSAGE,13,44,161,8
+ GROUPBOX "メッセージ リスト",IDC_STATIC,7,83,191,117
+ EDITTEXT IDC_ERRORLIST,13,113,179,80,ES_MULTILINE |
+ ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_DISABLED |
+ WS_VSCROLL | WS_HSCROLL
+ CONTROL "エラー",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,13,97,35,10
+ CONTROL "デバッグ",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,50,97,35,10
+ EDITTEXT IDC_DEBUGLIST,13,113,179,80,ES_MULTILINE |
+ ES_AUTOVSCROLL | ES_AUTOHSCROLL | NOT WS_VISIBLE |
+ WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+ LTEXT "Version",IDC_STATIC_VERSION,7,214,140,8
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_VARLIST$(JPN) DIALOG DISCARDABLE 0, 0, 215, 199
+#else
+IDD_VARLIST DIALOG DISCARDABLE 0, 0, 215, 199
+#endif
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+CAPTION "ブレーク ポイント"
+FONT 9, "MS Pゴシック"
+BEGIN
+ PUSHBUTTON "閉じる",IDCANCEL,165,6,50,14
+ LTEXT "対象領域:",IDC_STATIC,2,9,30,8
+ LTEXT "対象スレッド:",IDC_STATIC,2,26,38,8
+ COMBOBOX IDC_THREADCOMBO,43,24,69,100,CBS_DROPDOWNLIST | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ CONTROL "Tree1",IDC_VARTREE,"SysTreeView32",TVS_HASBUTTONS |
+ TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP,
+ 0,88,215,111
+ CONTROL "グローバル",IDC_GLOBAL,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,43,6,47,14
+ CONTROL "ローカル",IDC_LOCAL,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,92,6,47,14
+ LTEXT "プロシージャ:",IDC_STATIC,2,43,39,8
+ COMBOBOX IDC_PROCCOMBO,43,40,69,116,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ CONTROL "システム変数を表示しない",IDC_HIDESYSVAR,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,117,44,93,10
+ PUSHBUTTON "ステップ(IN)",IDC_STEPIN,4,64,50,14
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,59,215,1
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,81,215,1
+ PUSHBUTTON "ステップ(OVER)",IDC_STEPOVER,57,64,50,14
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_CLIPMAIN$(JPN) DIALOGEX 0, 0, 332, 88
+#else
+IDD_CLIPMAIN DIALOGEX 0, 0, 332, 88
+#endif
+STYLE WS_CHILD
+FONT 9, "MS Pゴシック"
+BEGIN
+ PUSHBUTTON "コンパイル",IDOK,0,0,37,13
+ EDITTEXT IDC_EXEPATH,285,57,24,12,ES_AUTOHSCROLL | ES_READONLY |
+ NOT WS_VISIBLE
+ EDITTEXT IDC_ERRORLIST,38,14,129,74,ES_MULTILINE | ES_AUTOVSCROLL |
+ ES_AUTOHSCROLL | WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+ CONTROL "ビルド",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,0,20,37,12
+ CONTROL "デバッグ",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,0,34,37,12
+ EDITTEXT IDC_DEBUGLIST,38,15,179,73,ES_MULTILINE | ES_AUTOVSCROLL |
+ ES_AUTOHSCROLL | NOT WS_VISIBLE | WS_DISABLED |
+ WS_VSCROLL | WS_HSCROLL
+ CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH,
+ 38,1,293,12
+ LTEXT "準備中...",IDC_MESSAGE,286,47,24,8,NOT WS_VISIBLE,
+ WS_EX_TRANSPARENT
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,16,39,1
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_CLIPMAIN$(ENG) DIALOGEX 0, 0, 332, 88
+#else
+IDD_CLIPMAIN DIALOGEX 0, 0, 332, 88
+#endif
+STYLE WS_CHILD
+FONT 9, "MS Pゴシック", 0, 0, 0x1
+BEGIN
+ PUSHBUTTON "Compile",IDOK,0,0,37,11
+ EDITTEXT IDC_EXEPATH,285,57,24,12,ES_AUTOHSCROLL | ES_READONLY |
+ NOT WS_VISIBLE
+ EDITTEXT IDC_ERRORLIST,38,13,129,75,ES_MULTILINE | ES_AUTOVSCROLL |
+ ES_AUTOHSCROLL | WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+ CONTROL "Error",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,0,17,37,10
+ CONTROL "Debug",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,0,28,37,10
+ EDITTEXT IDC_DEBUGLIST,38,14,179,74,ES_MULTILINE | ES_AUTOVSCROLL |
+ ES_AUTOHSCROLL | NOT WS_VISIBLE | WS_DISABLED |
+ WS_VSCROLL | WS_HSCROLL
+ CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH,
+ 38,0,293,12
+ LTEXT "Waiting...",IDC_MESSAGE,286,47,24,8,NOT WS_VISIBLE,
+ WS_EX_TRANSPARENT
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,13,39,1
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_MAIN$(ENG) DIALOG DISCARDABLE 0, 0, 205, 229
+#else
+IDD_MAIN DIALOG DISCARDABLE 0, 0, 205, 229
+#endif
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "ActiveBasic Compiler&Debugger"
+FONT 9, "MS Pゴシック"
+BEGIN
+ DEFPUSHBUTTON "Compile",IDOK,148,208,50,14
+ LTEXT "Output:",IDC_STATIC,7,10,22,8
+ EDITTEXT IDC_EXEPATH,34,7,164,14,ES_AUTOHSCROLL
+ CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",0x0,13,56,
+ 179,14
+ GROUPBOX "Advance situation",IDC_STATIC,7,31,191,45
+ LTEXT "ready...",IDC_MESSAGE,13,44,161,8
+ GROUPBOX "Message list",IDC_STATIC,7,83,191,117
+ EDITTEXT IDC_ERRORLIST,13,113,179,80,ES_MULTILINE |
+ ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_DISABLED |
+ WS_VSCROLL | WS_HSCROLL
+ CONTROL "Error",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,13,97,30,10
+ CONTROL "Debug",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,50,97,35,10
+ EDITTEXT IDC_DEBUGLIST,13,113,179,80,ES_MULTILINE |
+ ES_AUTOVSCROLL | ES_AUTOHSCROLL | NOT WS_VISIBLE |
+ WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+ LTEXT "Version 4.00 Global Edition beta1",IDC_STATIC,7,214,98,
+ 8
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_VARLIST$(ENG) DIALOG DISCARDABLE 0, 0, 215, 199
+#else
+IDD_VARLIST DIALOG DISCARDABLE 0, 0, 215, 199
+#endif
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+CAPTION "Breakpoint"
+FONT 9, "MS Pゴシック"
+BEGIN
+ PUSHBUTTON "Close",IDCANCEL,165,6,50,14
+ LTEXT "Level:",IDC_STATIC,2,9,18,8
+ LTEXT "Thread:",IDC_STATIC,2,26,22,8
+ COMBOBOX IDC_THREADCOMBO,43,24,69,100,CBS_DROPDOWNLIST | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ CONTROL "Tree1",IDC_VARTREE,"SysTreeView32",TVS_HASBUTTONS |
+ TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP,
+ 0,88,215,111
+ CONTROL "Global",IDC_GLOBAL,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,43,6,47,14
+ CONTROL "Local",IDC_LOCAL,"Button",BS_AUTORADIOBUTTON |
+ BS_PUSHLIKE,92,6,47,14
+ LTEXT "Procedure:",IDC_STATIC,2,43,31,8
+ COMBOBOX IDC_PROCCOMBO,43,40,69,116,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ CONTROL "Hide system variables",IDC_HIDESYSVAR,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,117,44,81,10
+ PUSHBUTTON "Step In",IDC_STEPIN,4,64,50,14
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,59,215,1
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,81,215,1
+ PUSHBUTTON "Step Over",IDC_STEPOVER,57,64,50,14
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_DEBUGGER$(JPN) DIALOGEX 0, 0, 291, 148
+#else
+IDD_DEBUGGER DIALOGEX 0, 0, 291, 148
+#endif
+STYLE WS_CHILD
+FONT 9, "MS Pゴシック", 0, 0, 0x1
+BEGIN
+ LTEXT "対象スレッド:",IDC_STATIC,5,21,38,8
+ COMBOBOX IDC_THREADCOMBO,5,30,69,100,CBS_DROPDOWNLIST | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ LTEXT "プロシージャ:",IDC_STATIC,5,49,39,8
+ COMBOBOX IDC_PROCCOMBO,5,58,69,116,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,15,99,1
+ LTEXT "dummy",IDC_VARPOS,98,0,35,41,NOT WS_VISIBLE,
+ WS_EX_STATICEDGE
+ CONTROL "List2",IDC_WATCHLIST,"SysListView32",LVS_REPORT |
+ LVS_EDITLABELS | WS_BORDER | WS_TABSTOP,171,9,60,50,
+ WS_EX_ACCEPTFILES
+ LTEXT "コマンド",IDC_STATIC,3,3,23,8
+END
+#endif
+
+IDD_DEBUGGER_TOOLBARBASE DIALOG DISCARDABLE 0, 0, 62, 15
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "MS Pゴシック"
+BEGIN
+END
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_DEBUGGER$(ENG) DIALOGEX 0, 0, 291, 148
+#else
+IDD_DEBUGGER DIALOGEX 0, 0, 291, 148
+#endif
+STYLE WS_CHILD
+FONT 9, "MS Pゴシック", 0, 0, 0x1
+BEGIN
+ LTEXT "Thread:",IDC_STATIC,5,21,22,8
+ COMBOBOX IDC_THREADCOMBO,5,30,69,100,CBS_DROPDOWNLIST | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ LTEXT "Procedure:",IDC_STATIC,5,49,31,8
+ COMBOBOX IDC_PROCCOMBO,5,58,69,116,CBS_DROPDOWNLIST | WS_VSCROLL |
+ WS_TABSTOP
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,15,99,1
+ LTEXT "dummy",IDC_VARPOS,98,0,35,41,NOT WS_VISIBLE,
+ WS_EX_STATICEDGE
+ CONTROL "List2",IDC_WATCHLIST,"SysListView32",LVS_REPORT |
+ LVS_EDITLABELS | WS_BORDER | WS_TABSTOP,171,9,60,50,
+ WS_EX_ACCEPTFILES
+ LTEXT "コマンド",IDC_STATIC,3,3,23,8
+END
+#endif
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE
+BEGIN
+ "IDD_MAIN$(JPN)", DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 198
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 222
+ END
+
+ "IDD_VARLIST$(JPN)", DIALOG
+ BEGIN
+ BOTTOMMARGIN, 161
+ END
+
+ "IDD_MAIN$(ENG)", DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 198
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 222
+ END
+
+ "IDD_VARLIST$(ENG)", DIALOG
+ BEGIN
+ BOTTOMMARGIN, 161
+ END
+
+ IDD_DEBUGGER_TOOLBARBASE, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 55
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 8
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_MAIN ICON DISCARDABLE "icon1.ico"
+IDI_VARSTRUCT ICON DISCARDABLE "VarStruct.ico"
+IDI_VARDATA ICON DISCARDABLE "VarData.ico"
+IDI_VARSTR ICON DISCARDABLE "VarStr.ico"
+IDI_VARARRAY ICON DISCARDABLE "VarArray.ico"
+IDI_VARPTRSTRUCT ICON DISCARDABLE "VarPtrStruct.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Toolbar
+//
+
+IDR_DEBUGGERTOOLBAR TOOLBAR DISCARDABLE 16, 15
+BEGIN
+ BUTTON IDC_DEBUG_START
+ BUTTON IDC_DEBUG_STEPOVER
+ BUTTON IDC_DEBUG_STEPIN
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Bitmap
+//
+
+IDR_DEBUGGERTOOLBAR BITMAP DISCARDABLE "toolbar_debugger.bmp"
+IDR_DEBUGGERTOOLBAR_DISABLED BITMAP DISCARDABLE "toolbar_debugger_disable.bmp"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDR_DEBUGGER_VARLIST_MENU MENU DISCARDABLE
+BEGIN
+ POPUP "dummy"
+ BEGIN
+ MENUITEM "一般システム変数を表示する", IDM_SHOW_DEFAULTSYSTEM_VAR
+ MENUITEM "RADシステム変数を表示する", IDM_SHOW_RAD_VAR
+ MENUITEM "GUID変数を表示する", IDM_SHOW_GUID_VAR
+ END
+END
+
+#endif // 日本語 resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
Index: /BasicCompiler64/BasicCompiler.vcproj
===================================================================
--- /BasicCompiler64/BasicCompiler.vcproj (revision 3)
+++ /BasicCompiler64/BasicCompiler.vcproj (revision 3)
@@ -0,0 +1,1521 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /BasicCompiler64/BasicCompiler64.sln
===================================================================
--- /BasicCompiler64/BasicCompiler64.sln (revision 3)
+++ /BasicCompiler64/BasicCompiler64.sln (revision 3)
@@ -0,0 +1,23 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual C++ Express 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BasicCompiler", "BasicCompiler.vcproj", "{864B921B-423B-4F9E-9E6B-31B15968EDF9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ English_Rel|Win32 = English_Rel|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {864B921B-423B-4F9E-9E6B-31B15968EDF9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {864B921B-423B-4F9E-9E6B-31B15968EDF9}.Debug|Win32.Build.0 = Debug|Win32
+ {864B921B-423B-4F9E-9E6B-31B15968EDF9}.English_Rel|Win32.ActiveCfg = English_Rel|Win32
+ {864B921B-423B-4F9E-9E6B-31B15968EDF9}.English_Rel|Win32.Build.0 = English_Rel|Win32
+ {864B921B-423B-4F9E-9E6B-31B15968EDF9}.Release|Win32.ActiveCfg = Release2|Win32
+ {864B921B-423B-4F9E-9E6B-31B15968EDF9}.Release|Win32.Build.0 = Release2|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
Index: /BasicCompiler64/CLockParameter.cpp
===================================================================
--- /BasicCompiler64/CLockParameter.cpp (revision 3)
+++ /BasicCompiler64/CLockParameter.cpp (revision 3)
@@ -0,0 +1,15 @@
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+CDBLockParms::CDBLockParms(){
+}
+CDBLockParms::~CDBLockParms(){
+}
+void CDBLockParms::lock(int level){
+ array_LevelCount[level]++;
+}
+void CDBLockParms::unlock(int level){
+ array_LevelCount[level]--;
+}
+
+CDBLockParms obj_DBLockParms;
Index: /BasicCompiler64/CParameter.cpp
===================================================================
--- /BasicCompiler64/CParameter.cpp (revision 3)
+++ /BasicCompiler64/CParameter.cpp (revision 3)
@@ -0,0 +1,721 @@
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+CParameter::CParameter(char *buffer){
+ ///////////////////////////
+ // パラメータ文字列を整理
+ ///////////////////////////
+
+ extern HANDLE hHeap;
+ int i,i2,i3;
+ char temporary[VN_SIZE];
+
+ i=0;
+ ParmsNum=0;
+ while(1){
+ if(buffer[i]=='\0') break;
+
+ for(i2=0;;i2++,i++){
+ if(buffer[i]=='\"'){
+ temporary[i2]=buffer[i];
+ for(i++,i2++;;i++,i2++){
+ temporary[i2]=buffer[i];
+ if(buffer[i]=='\"') break;
+ }
+ continue;
+ }
+
+ if(buffer[i]=='('){
+ i3=GetStringInPare(temporary+i2,buffer+i);
+ i2+=i3-1;
+ i+=i3-1;
+ continue;
+ }
+ if(buffer[i]=='['){
+ i3=GetStringInBracket(temporary+i2,buffer+i);
+ i2+=i3-1;
+ i+=i3-1;
+ continue;
+ }
+
+ if(buffer[i]==','||buffer[i]=='\0'){
+ temporary[i2]=0;
+ break;
+ }
+ temporary[i2]=buffer[i];
+ }
+
+ Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+ lstrcpy(Parms[ParmsNum],temporary);
+ ParmsNum++;
+
+ if(buffer[i]==',') i++;
+ }
+
+ ReturnTypeInfo.type=0;
+ ReturnTypeInfo.u.lpIndex=0;
+}
+CParameter::CParameter(PARAMETER_INFO *pParamInfo,int ParmNum){
+ int i;
+ for(i=0;iParmsNum=ParmNum;
+
+ ReturnTypeInfo.type=0;
+ ReturnTypeInfo.u.lpIndex=0;
+}
+CParameter::~CParameter(){
+ int i2;
+
+ //パラメータ文字列を解放
+ for(i2=0;i2type){
+ if(NATURAL_TYPE(ReturnTypeInfo.type)==DEF_OBJECT){
+ if(ReturnTypeInfo.u.lpIndex != pReturnTypeInfo->u.lpIndex) return 0;
+ }
+ }
+ else return 0;
+ }
+
+ return 1;
+}
+SUBINFO *CParameter::OverloadSolutionWithReturnType(char *name,SUBINFO **ppsi,int num){
+ int i,sw=0;
+ SUBINFO *psi;
+ psi=0;
+ for(i=0;iReturnType;
+ ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
+
+ //エラーチェック
+ if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL1)){
+ if(sw){
+ SetError(52,name,cp);
+ return 0;
+ }
+ sw=1;
+ break;
+ }
+ }
+
+ if(!sw){
+ for(i=0;iReturnType;
+ ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
+
+ //エラーチェック
+ if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL2)){
+ if(sw){
+ SetError(52,name,cp);
+ return 0;
+ }
+ sw=1;
+ break;
+ }
+ }
+ }
+
+ if(!sw){
+ for(i=0;iReturnType;
+ ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
+
+ //エラーチェック
+ if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL3)){
+ if(sw){
+ SetError(52,name,cp);
+ return 0;
+ }
+ sw=1;
+ break;
+ }
+ }
+ }
+
+ if(!sw){
+ SetError(52,name,cp);
+ return 0;
+ }
+
+ return psi;
+}
+
+SUBINFO *CParameter::OverloadSolution(char *name,SUBINFO **ppsi,int num){
+ int i,sw=0;
+ SUBINFO *psi;
+ psi=0;
+ for(i=0;ipParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL1)){
+ if(sw){
+ return OverloadSolutionWithReturnType(name,ppsi,num);
+ }
+ sw=1;
+ break;
+ }
+ }
+
+ if(!sw){
+ for(i=0;ipParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL2)){
+ if(sw){
+ return OverloadSolutionWithReturnType(name,ppsi,num);
+ }
+ sw=1;
+ break;
+ }
+ }
+ }
+
+ if(!sw){
+ for(i=0;ipParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL3)){
+ if(sw){
+ return OverloadSolutionWithReturnType(name,ppsi,num);
+ }
+ sw=1;
+ break;
+ }
+ }
+ }
+
+ if(!sw){
+ SUBINFO *temp_psi;
+ for(i=0;iParmNum==this->ParmsNum){
+ if(sw){
+ sw=0;
+ break;
+ }
+ sw=1;
+
+ psi=temp_psi;
+ }
+ }
+ }
+
+ if(!sw){
+ SetError(52,name,cp);
+ return 0;
+ }
+
+ return psi;
+}
+
+BOOL CParameter::ErrorCheck(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
+ if(ParmsNum>pi_num){
+ if(ppi[pi_num-1].type!=DEF_ELLIPSE){
+ //パラメータが多すぎるとき
+ SetError(10,FuncName,cp);
+ return 0;
+ }
+ }
+ else if(ParmsNumpush(REG_R11);
+
+ TYPEINFO BaseType={DEF_OBJECT,(LONG_PTR)pobj_Class};
+ TYPEINFO CalcType;
+ CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex);
+
+ if(pobj_Class->CopyConstructorMemberSubIndex!=-1&&
+ CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){
+ ////////////////////////////////////
+ // コピーコンストラクタを呼び出す
+ ////////////////////////////////////
+
+ BOOL bUseHeap;
+ int temp_reg=REG_RDX;
+ CalcType.type=NumOpe(&temp_reg,Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
+
+ if(bUseHeap){
+ //mov r14,rdx
+ op_mov_RR(REG_R14,REG_RDX);
+ }
+
+ //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->ref(REG_R11);
+
+ //mov rcx,this
+ op_mov_RR(REG_RCX,REG_R11);
+
+ //call constructor
+ op_call(pobj_Class->ppobj_Method[pobj_Class->CopyConstructorMemberSubIndex]->psi);
+
+
+ if(bUseHeap){
+ FreeTempObject(REG_R14,pobj_Class);
+ }
+ }
+ else{
+ if(pobj_Class->ConstructorMemberSubIndex!=-1){
+ ////////////////////////////////
+ // コンストラクタを呼び出す
+ ////////////////////////////////
+
+ //mov rcx,this
+ op_mov_RR(REG_RCX,REG_R11);
+
+ //call constructor
+ op_call(pobj_Class->ppobj_Method[pobj_Class->ConstructorMemberSubIndex]->psi);
+ }
+
+
+ BOOL bUseHeap;
+ int temp_reg=REG_RAX;
+ CalcType.type=NumOpe(&temp_reg,Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
+
+
+ //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->ref(REG_R11);
+
+
+ RELATIVE_VAR RelativeVar;
+ RelativeVar.bOffsetOffset=0;
+ RelativeVar.offset=0;
+ RelativeVar.dwKind=VAR_DIRECTMEM;
+
+ SetObjectVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap);
+
+ }
+
+ //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R11);
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+
+ //mov reg,r11
+ op_mov_RR(reg,REG_R11);
+}
+void CParameter::SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
+ ///////////////////////////////////////////////////////////
+ // パラメータをレジスタ及びスタックフレームにセット
+ ///////////////////////////////////////////////////////////
+ int i2,i3;
+
+ BOOL bEllipse;
+ if(pi_num){
+ if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
+ else bEllipse=0;
+ }
+ else bEllipse=0;
+
+ BOOL bHas_System_LocalThis=0;
+ if(ParmsNum>=1){
+ if(lstrcmp(ppi[0].name,"_System_LocalThis")==0)
+ bHas_System_LocalThis=1;
+ }
+
+ //パラメータをレジスタとスタックに格納
+ int CalcType;
+ LONG_PTR lpCalcIndex;
+ BOOL bCalcUseHeap;
+ int ParmSize=0;
+ int reg,temp_reg;
+ RELATIVE_VAR RelativeVar;
+ for(i2=ParmsNum-1;i2>=0;i2--){
+ if(bEllipse&&i2<=pi_num-2) bEllipse=0;
+
+ if(i2==0&&ppi[i2].name){
+ if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){
+ //オブジェクトメンバの第一パラメータのThisポインタ
+ continue;
+ }
+ }
+ if((i2==0||i2==1)&&ppi[i2].name){
+ if(lstrcmp(ppi[i2].name,FuncName)==0){
+ //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
+ continue;
+ }
+ }
+
+ TYPEINFO DummyTypeInfo;
+ BOOL bByVal;
+ if(bEllipse){
+ DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
+ bByVal=1;
+ }
+ else{
+ DummyTypeInfo.type=ppi[i2].type;
+ DummyTypeInfo.u.lpIndex=ppi[i2].u.index;
+ bByVal=ppi[i2].bByVal;
+ }
+
+ int xmm_temp_sw=0;
+ if(IsRealNumberType(DummyTypeInfo.type)&&bByVal){
+ //実数型
+ if(i2==0) reg=REG_XMM0;
+ else if(i2==1) reg=REG_XMM1;
+ else if(i2==2) reg=REG_XMM2;
+ else if(i2==3) reg=REG_XMM3;
+ else{
+ reg=REG_XMM0;
+ xmm_temp_sw=1;
+ }
+ }
+ else{
+ //整数型
+ if(i2==0) reg=REG_RCX;
+ else if(i2==1) reg=REG_RDX;
+ else if(i2==2) reg=REG_R8;
+ else if(i2==3) reg=REG_R9;
+ else reg=REG_RAX;
+ }
+
+ if(bByVal==1){
+ //値参照
+
+ if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
+ char temp2[255];
+ sprintf(temp2,"%s関数の第%dパラメータ",FuncName,i2+1);
+ SetError(19,temp2,cp);
+ continue;
+ }
+
+ if(DummyTypeInfo.type==DEF_OBJECT){
+ SetObjectParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]);
+ goto next;
+ }
+
+ temp_reg=reg;
+
+ extern LONG_PTR ProcPtr_BaseIndex;
+ LONG_PTR back_ProcPtr_BaseIndex;
+ back_ProcPtr_BaseIndex=ProcPtr_BaseIndex;
+ if(DummyTypeInfo.type==DEF_PTR_PROC) ProcPtr_BaseIndex=DummyTypeInfo.u.lpIndex;
+ else ProcPtr_BaseIndex=-1;
+
+ CalcType=NumOpe(&temp_reg,Parms[i2],DummyTypeInfo.type,DummyTypeInfo.u.lpIndex,&lpCalcIndex,&bCalcUseHeap);
+
+ ProcPtr_BaseIndex=back_ProcPtr_BaseIndex;
+
+ if(CalcType==-1) break;
+
+ if(CalcType==DEF_OBJECT){
+ //キャスト演算子のオーバーロードに対応する
+ CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
+ }
+
+
+ if(bEllipse){
+ if(IsRealNumberType(CalcType)){
+ //整数レジスタへコピー
+ //※cdeclの拡張パラメータは実数の場合も汎用レジスタで引渡し
+
+ if(0<=i2&&i2<=3){
+ if(i2==0) reg=REG_RCX;
+ else if(i2==1) reg=REG_RDX;
+ else if(i2==2) reg=REG_R8;
+ else if(i2==3) reg=REG_R9;
+
+ //movd reg,temp_reg
+ op_movd_RX(reg,temp_reg);
+ }
+ }
+ else if(IsWholeNumberType(CalcType)){
+ //整数型の場合は、64ビットへ拡張する
+ ExtendTypeTo64(CalcType,temp_reg);
+ }
+ }
+ else{
+ //型チェック
+ if(bHas_System_LocalThis) i3=i2-1;
+ else i3=i2;
+ CheckDifferentType(
+ DummyTypeInfo.type,
+ DummyTypeInfo.u.lpIndex,
+ CalcType,
+ lpCalcIndex,
+ FuncName,
+ i3);
+
+
+ if(DummyTypeInfo.type==DEF_DOUBLE){
+ //Double型へ変換
+ ChangeTypeToXmm_Double(CalcType,reg,temp_reg);
+ }
+ else if(DummyTypeInfo.type==DEF_SINGLE){
+ //Single型へ変換
+ ChangeTypeToXmm_Single(CalcType,reg,temp_reg);
+ }
+ else if(IsWholeNumberType(DummyTypeInfo.type)){
+ //実数型 → 整数型
+ ChangeTypeToWhole(CalcType,DummyTypeInfo.type,reg,temp_reg);
+ }
+ }
+ }
+ else{
+ //ポインタ参照
+ if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
+ //ポインタ指定
+
+ temp_reg=reg;
+ CalcType=NumOpe(&temp_reg,Parms[i2]+2,0,0,&lpCalcIndex);
+ if(CalcType==-1) break;
+
+ int ptr_type;
+ ptr_type=GetPtrType(DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
+
+ //型チェック
+ if(bHas_System_LocalThis) i3=i2-1;
+ else i3=i2;
+ CheckDifferentType(
+ ptr_type,
+ DummyTypeInfo.u.lpIndex,
+ CalcType,
+ lpCalcIndex,
+ FuncName,
+ i3);
+
+ if(IsRealNumberType(CalcType)){
+ //実数型 → 整数型
+ ChangeTypeToWhole(CalcType,DEF_QWORD,reg,temp_reg);
+ }
+ }
+ else{
+ //変数のアドレスを取得
+ int VarType;
+ LONG_PTR lpVarIndex;
+ if(!GetVarOffset(1,Parms[i2],&VarType,&RelativeVar,&lpVarIndex)) continue;
+
+ if(DummyTypeInfo.type!=DEF_ANY){
+ //型チェックを行う
+ if(DummyTypeInfo.type==VarType){
+ if(DummyTypeInfo.type==DEF_OBJECT){
+ if(DummyTypeInfo.u.lpIndex!=lpVarIndex){
+ SetError(11,Parms[i2],cp);
+ }
+ }
+ }
+ else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){
+ //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
+ }
+ else{
+ SetError(11,Parms[i2],cp);
+ }
+ }
+
+ //変数アドレスをレジスタにセット
+ SetVarPtrToReg(reg,&RelativeVar);
+ }
+ }
+next:
+ if(reg==REG_RAX){
+ //スタックフレームへコピー
+ //mov qword ptr[rsp+offset],rax
+ op_mov_MR(sizeof(_int64),REG_RAX,REG_RSP,i2*sizeof(_int64),MOD_BASE_DISP32);
+ }
+ else if(xmm_temp_sw){
+ //スタックフレームへコピー
+
+ //movlpd qword ptr[rsp+offset],xmm0
+ op_movlpd_MR(REG_XMM0,REG_RSP,i2*sizeof(_int64),MOD_BASE_DISP32);
+ }
+
+
+ /////////////////////
+ // レジスタをロック
+ /////////////////////
+
+ if(0<=i2&&i2<=3){
+ // ※rcx, rdx, r8, r9の場合のみ
+ pobj_BlockReg->lock(reg);
+ }
+ }
+
+ //パラメータが収まるだけのスタックフレームを確保
+ pobj_sf->parameter_allocate(pi_num*sizeof(_int64)+ sizeof(_int64)/*ret用*/ );
+}
+void CParameter::BackupParameter(int pi_num){
+ ///////////////////////////////////////////////////////////
+ // スタックフレームに存在する既存のパラメータをバックアップ
+ ///////////////////////////////////////////////////////////
+ int i2;
+
+ for(i2=0;i2push(REG_R14);
+ }
+
+ if(3=0;i2--){
+ /////////////////////
+ // 復元
+ /////////////////////
+
+ if(3pop(REG_R14);
+
+ //mov qword ptr[rsp+offset],r14
+ op_mov_MR(sizeof(_int64),REG_R14,REG_RSP,i2*sizeof(_int64),MOD_BASE_DISP32);
+ }
+ }
+}
Index: /BasicCompiler64/CommandValue.h
===================================================================
--- /BasicCompiler64/CommandValue.h (revision 3)
+++ /BasicCompiler64/CommandValue.h (revision 3)
@@ -0,0 +1,95 @@
+/* 命令語定数 */
+
+//条件、分岐、繰り返し
+#define COM_DO 0x1021
+/* 0x22は「"」なので使用不可 */
+#define COM_GOTO 0x1023
+#define COM_GOSUB 0x1024
+#define COM_LOOP 0x1026
+#define COM_RETURN 0x1027
+/* 0x28は「(」なので使用不可 */
+/* 0x29は「)」なので使用不可 */
+#define COM_FOR 0x1031
+#define COM_NEXT 0x1032
+#define COM_WHILE 0x1036
+#define COM_WEND 0x1037
+
+//データ操作
+#define COM_DIM 0x1062
+#define COM_LET 0x1066
+#define COM_DELETE 0x1068
+
+//その他
+#define COM_DEBUG 0x1073
+
+//ポインタ
+#define COM_SETDOUBLE 0x10C1
+#define COM_SETSINGLE 0x10C2
+#define COM_SETQWORD 0x10C3
+#define COM_SETDWORD 0x10C4
+#define COM_SETWORD 0x10C5
+#define COM_SETBYTE 0x10C6
+
+
+
+///////////////////////////////////
+// 以下はProjectEditorで使用される
+
+//入出力コマンド
+#define COM_PRINT 0x1150
+#define COM_INPUT 0x1151
+#define COM_OPEN 0x1152
+#define COM_CLOSE 0x1153
+#define COM_FIELD 0x1154
+#define COM_WRITE 0x1155
+
+//条件、分岐、繰り返し
+#define COM_IF 0x1160
+#define COM_SELECT 0x1161
+
+//ファイル操作
+#define COM_CHDIR 0x1170
+#define COM_KILL 0x1171
+#define COM_MKDIR 0x1172
+#define COM_GET 0x1173
+#define COM_PUT 0x1174
+
+//グラフィックス
+#define COM_CIRCLE 0x1180
+#define COM_LINE 0x1181
+#define COM_PAINT 0x1182
+#define COM_PSET 0x1183
+
+//データ操作
+#define COM_CONST 0x1190
+#define COM_TYPEDEF 0x1191
+
+//クラス関連
+#define COM_CLASS 0x1195
+#define COM_PRIVATE 0x1196
+#define COM_PUBLIC 0x1197
+#define COM_INHERITS 0x1198
+#define COM_PROTECTED 0x1199
+
+//その他
+#define COM_BEEP 0x11A0
+#define COM_CLS 0x11A1
+#define COM_COLOR 0x11A2
+#define COM_DECLARE 0x11A4
+#define COM_DEF 0x11A5
+#define COM_END 0x11A6
+#define COM_FUNCTION 0x11A7
+#define COM_LOCATE 0x11A8
+#define COM_RANDOMIZE 0x11A9
+#define COM_REM 0x11AA
+#define COM_SLEEP 0x11AB
+#define COM_SUB 0x11AC
+#define COM_TYPE 0x11AD
+#define COM_VIRTUAL 0x11AE
+#define COM_WITH 0x11AF
+#define COM_ENUM 0x11B0
+
+//ウィンドウ制御
+#define COM_DELWND 0x11C0
+#define COM_MSGBOX 0x11C1
+#define COM_WINDOW 0x11C2
Index: /BasicCompiler64/Compile_Calc.cpp
===================================================================
--- /BasicCompiler64/Compile_Calc.cpp (revision 3)
+++ /BasicCompiler64/Compile_Calc.cpp (revision 3)
@@ -0,0 +1,575 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void ChangeTypeToDouble_ToFpuReg(int OldType){
+ //現在のスタックの内容を実数レジスタに保存する
+ //NumOpeの直後専用
+ if(OldType==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,8
+ op_add_esp(8);
+ }
+ else if(OldType==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(OldType==DEF_LONG){
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+
+ //add esp,4
+ op_add_esp(4);
+ }
+ else if(OldType==DEF_DWORD){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //push 0
+ op_push_value(0);
+
+ //push eax
+ op_push(REG_EAX);
+
+ //fild qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x2C;
+ OpBuffer[obp++]=(char)0x24;
+
+ //add esp,8
+ op_add_esp(8);
+ }
+}
+void ChangeTypeToDouble(int OldType){
+ //現在のスタックの内容をdouble型に変換する
+ //NumOpeの直後専用
+ if(OldType==DEF_DOUBLE) return;
+ else if(OldType==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //fstp qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDD;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(OldType==DEF_INT64||OldType==DEF_QWORD){
+ //64ビット整数型
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //fstp qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDD;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(IsWholeNumberType(OldType)){
+ //その他整数型
+
+ if(IsSignedType(OldType)){
+ //符号あり
+
+ if(OldType==DEF_INTEGER){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //movsx eax,ax
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else if(OldType==DEF_CHAR){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //movsx eax,al
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //push eax
+ op_push(REG_EAX);
+ }
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+
+ //sub esp,4
+ op_sub_esp(4);
+ }
+ else{
+ //符号なし
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //push 0
+ op_push_value(0);
+
+ //push eax
+ op_push(REG_EAX);
+
+ //fild qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x2C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+
+ //fstp qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDD;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else SetError(9,NULL,cp);
+}
+void ChangeTypeToSingle(int OldType){
+ //現在のスタックの内容をfloat型に変換する
+ //NumOpeの直後専用
+ if(OldType==DEF_SINGLE) return;
+ else if(OldType==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //fstp dword ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(OldType==DEF_INT64||OldType==DEF_QWORD){
+ //64ビット整数型
+
+ //fild qword ptr[esp]
+ op_fld_ptr_esp(DEF_INT64);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //fstp dword ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(IsWholeNumberType(OldType)){
+ //その他整数型
+
+ if(IsSignedType(OldType)){
+ //符号あり
+
+ if(OldType==DEF_INTEGER){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //movsx eax,ax
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else if(OldType==DEF_CHAR){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //movsx eax,al
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)0xC0;
+
+ //push eax
+ op_push(REG_EAX);
+ }
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+ }
+ else{
+ //符号なし
+
+ //fild dword ptr[esp]
+ op_fld_ptr_esp(DEF_LONG);
+ }
+
+ //fstp dword ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else SetError(9,NULL,cp);
+}
+void ChangeTypeToInt64(int OldType){
+ //現在のスタックの内容をInt64型に変換する
+ //NumOpeの直後専用
+ if(Is64Type(OldType)) return;
+
+ else if(OldType==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //fistp qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(OldType==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //sub esp,4
+ op_sub_esp(4);
+
+ //fistp qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x3C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(IsWholeNumberType(OldType)){
+ //その他整数
+
+ if(IsSignedType(OldType)){
+ //符号あり
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //cdq
+ OpBuffer[obp++]=(char)0x99;
+
+ //push edx
+ op_push(REG_EDX);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ else{
+ //符号なし
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //push 0
+ op_push_value(0);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+ }
+ else SetError(9,NULL,cp);
+}
+void ChangeTypeToLong(int OldType){
+ //現在のスタックの内容をLong型に変換する
+ //NumOpeの直後専用
+ if(OldType==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ op_fld_ptr_esp(DEF_DOUBLE);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //fistp dword ptr[esp]
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(OldType==DEF_SINGLE){
+ //fld dword ptr[esp]
+ op_fld_ptr_esp(DEF_SINGLE);
+
+ //fistp dword ptr[esp]
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x1C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(OldType==DEF_INT64||OldType==DEF_QWORD){
+ //pop eax
+ op_pop(REG_EAX);
+
+ //add esp,4
+ op_add_esp(4);
+
+ //push eax
+ op_push(REG_EAX);
+ }
+}
+void ChangeTypeToInteger(int OldType){
+ //現在のスタックの内容をInteger型に変換する
+ if(OldType==DEF_BYTE||OldType==DEF_CHAR||
+ OldType==DEF_WORD||OldType==DEF_INTEGER) return;
+
+ ChangeTypeToLong(OldType);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //and eax,0000FFFFh
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=0x0000FFFF;
+ obp+=sizeof(long);
+
+ //push eax
+ op_push(REG_EAX);
+}
+void ChangeTypeToByte(int OldType){
+ //現在のスタックの内容をbyte型に変換する
+ if(OldType==DEF_BYTE||OldType==DEF_CHAR) return;
+
+ ChangeTypeToLong(OldType);
+
+ //pop eax
+ op_pop(REG_EAX);
+
+ //and eax,000000FFh
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=0x000000FF;
+ obp+=sizeof(long);
+
+ //push eax
+ op_push(REG_EAX);
+}
+
+void SetVariableFromRax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar){
+ /////////////////////////////////////////////////
+ // raxの内容を変数にコピーするコードを抽出
+ /////////////////////////////////////////////////
+
+ if(VarType==DEF_CHAR||VarType==DEF_BYTE){
+ //8ビット変数へalレジスタの内容を格納する
+ SetWholeVariable(sizeof(char),CalcType,pRelativeVar);
+ }
+ else if(VarType==DEF_INTEGER||VarType==DEF_WORD){
+ //16ビット変数へaxレジスタの内容を格納する
+ SetWholeVariable(sizeof(short),CalcType,pRelativeVar);
+ }
+ else if(VarType==DEF_LONG||VarType==DEF_DWORD){
+ //32ビット変数へeaxレジスタの内容を格納する
+ SetWholeVariable(sizeof(long),CalcType,pRelativeVar);
+ }
+ else if(VarType==DEF_INT64||VarType==DEF_QWORD||IsPtrType(VarType)){
+ //64ビット変数へraxレジスタの内容を格納する
+ SetWholeVariable(sizeof(_int64),CalcType,pRelativeVar);
+ }
+ else if(VarType==DEF_DOUBLE){
+ //Double型変数へスタックの内容を格納する
+ SetDoubleVariable(CalcType,pRelativeVar);
+ }
+ else if(VarType==DEF_SINGLE){
+ //Single型変数へスタックの内容を格納する
+ SetSingleVariable(CalcType,pRelativeVar);
+ }
+}
+void OpcodeCalc(char *Command){
+ int i,i2,i3;
+ char variable[VN_SIZE];
+
+
+
+ //////////////////////////////////////
+ // インクリメント・デクリメント
+ //////////////////////////////////////
+
+ for(i=0;;i++){
+ if(Command[i]=='\"'){
+ //ダブルクォートは不正なのでエラー扱い
+ variable[i]=0;
+ SetError(3,variable,cp);
+ return;
+ }
+
+ if(Command[i]=='('){
+ i2=GetStringInPare(variable+i,Command+i);
+ i+=i2-1;
+ continue;
+ }
+ if(Command[i]=='['){
+ i2=GetStringInBracket(variable+i,Command+i);
+ i+=i2-1;
+ continue;
+ }
+ if(Command[i]=='\0'){
+
+ ///////////////////////////////////
+ // インクリメント・デクリメント
+ ///////////////////////////////////
+
+ if(i>2){
+ if(Command[i-2]=='+'&&Command[i-1]=='+'){
+ //インクリメント
+ variable[i-2]=0;
+ IncDec(CALC_ADDITION,variable,"1");
+ return;
+ }
+ else if(Command[i-2]=='-'&&Command[i-1]=='-'){
+ //デクリメント
+ variable[i-2]=0;
+ IncDec(CALC_SUBTRACTION,variable,"1");
+ return;
+ }
+ }
+
+
+ //先端部分の識別子をエラーキーワードにする
+ for(i=0;;i++){
+ if(!IsVariableChar(Command[i])){
+ variable[i]=0;
+ break;
+ }
+ variable[i]=Command[i];
+ }
+
+ LONG_PTR lp;
+ if(GetVarType(variable,&lp,0)!=-1){
+ //変数リストに該当したとき
+ SetError(1,NULL,cp);
+ }
+ else{
+ if(GetConstHash(variable)){
+ //定数リストに該当したとき
+ SetError(1,NULL,cp);
+ }
+ else{
+ //変数リスト、定数リストに該当しないとき
+ SetError(3,variable,cp);
+ }
+ }
+ return;
+ }
+
+ i2=GetCalcId(Command+i,&i3);
+ if(i2){
+ variable[i]=0;
+
+ if(Command[i]=='=') break;
+
+ if(Command[i+1+i3]=='='){
+ IncDec(i2,variable,Command+i+1+i3+1);
+ return;
+ }
+ }
+
+ variable[i]=Command[i];
+ }
+
+ if(Command[i+1]=='\0'){
+ SetError(1,NULL,cp);
+ return;
+ }
+
+
+
+ ///////////////////////////////////////////////////////////////
+ // インデクサのsetアクセサ([]=演算子のオーバーロードに対応)
+ ///////////////////////////////////////////////////////////////
+
+ char ObjName[VN_SIZE],array_element[VN_SIZE];
+ CClass *pobj_c;
+ GetArrayElement(variable,ObjName,array_element);
+ if(array_element[0]){
+ i2=GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
+ if(i2==DEF_OBJECT){
+ char temporary[VN_SIZE];
+ sprintf(temporary,"%s.%c%c%c",ObjName,1,ESC_OPERATOR,CALC_ARRAY_SET);
+
+ char temp2[VN_SIZE];
+ sprintf(temp2,"%s,%s",array_element,Command+i+1);
+
+ int idProc;
+ void *pInfo;
+ idProc=GetProc(temporary,&pInfo);
+ if(idProc){
+ CallProc(idProc,pInfo,temporary,temp2,NULL);
+ return;
+ }
+ }
+ }
+
+
+
+ ////////////////////////////////////////
+ // 変数のタイプ型を識別して、演算を行う
+ ////////////////////////////////////////
+
+ int VarType,CalcType;
+ LONG_PTR lpVarIndex,lpCalcIndex;
+ BOOL bCalcUseHeap;
+
+ //型を識別
+ VarType=GetVarType(variable,&lpVarIndex,0);
+ if(VarType==-1){
+
+ // プロパティ用のメソッドを呼び出す
+ if(!CallPropertyMethod(variable,Command+i+1,NULL)){
+ //エラーを表示
+ GetVarType(variable,&lpVarIndex,1);
+ }
+
+ return;
+ }
+
+ extern LONG_PTR ProcPtr_BaseIndex;
+ if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
+ else ProcPtr_BaseIndex=-1;
+
+ //NumOpe...(rax、またはxmm0に答えが格納される)
+ int reg=REG_RAX;
+ CalcType=NumOpe(®,Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
+
+ //結果を格納しているレジスタをブロッキング
+ pobj_BlockReg->lock(reg);
+
+ if(VarType==-1||CalcType==-1) return;
+
+ //変数アドレスを取得
+ RELATIVE_VAR VarRelativeVar;
+ if(!GetVarOffset(
+ 1,
+ variable,
+ &VarType,
+ &VarRelativeVar,
+ &lpVarIndex)) return;
+
+ //レジスタのブロッキングを解除
+ pobj_BlockReg->clear();
+
+ if(VarType&FLAG_PTR){
+ SetError(14,variable,cp);
+ return;
+ }
+
+ if(VarType==DEF_OBJECT){
+ //オブジェクトインスタンスへの代入
+ SetObjectVariableFromRax(lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap);
+ return;
+ }
+
+ if(CalcType==DEF_OBJECT){
+ //キャスト演算子のオーバーロードに対応する
+ CallCastOperatorProc(REG_RAX,CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);
+ }
+
+
+ /////////////////////////////////
+ // 右辺、左辺の型チェックを行う
+ /////////////////////////////////
+
+ CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
+
+
+ /////////////////////////////////////////////////
+ // rax(実数はxmm0)の内容を変数にコピー
+ /////////////////////////////////////////////////
+ SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
+}
Index: /BasicCompiler64/Compile_Calc_PushVar.cpp
===================================================================
--- /BasicCompiler64/Compile_Calc_PushVar.cpp (revision 3)
+++ /BasicCompiler64/Compile_Calc_PushVar.cpp (revision 3)
@@ -0,0 +1,229 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+void SetXmmReg_DoubleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg){
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //movlpd xmm_reg,qword ptr[r11+offset]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x12;
+ OpBuffer[obp++]=(char)(0x83 | REGISTER_OPERAND(xmm_reg)<<3);
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //movlpd xmm_reg,qword ptr[offset]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x12;
+ OpBuffer[obp++]=(char)(0x04 | REGISTER_OPERAND(xmm_reg)<<3);
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //movlpd xmm_reg,qword ptr[rsp+r11+offset]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x42;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x12;
+ OpBuffer[obp++]=(char)(0x84 | REGISTER_OPERAND(xmm_reg)<<3);
+ OpBuffer[obp++]=(char)0x1C;
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //movlpd xmm_reg,qword ptr[rsp+offset]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x12;
+ OpBuffer[obp++]=(char)(0x84 | REGISTER_OPERAND(xmm_reg)<<3);
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add r11,qword ptr[rsp+offset]
+ OpBuffer[obp++]=(char)0x4C;
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0x9C;
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov r11,qword ptr[rsp+offset]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ goto directmem;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+ //movlpd xmm_reg,qword ptr[r11]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x12;
+ OpBuffer[obp++]=(char)(0x03 | REGISTER_OPERAND(xmm_reg)<<3);
+ }
+}
+void SetXmmReg_SingleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg){
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //movss xmm_reg,dword ptr[r11+offset]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x10;
+ OpBuffer[obp++]=(char)(0x83 | REGISTER_OPERAND(xmm_reg)<<3);
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //movss xmm_reg,dword ptr[offset]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x10;
+ OpBuffer[obp++]=(char)(0x04 | REGISTER_OPERAND(xmm_reg)<<3);
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //movss xmm_reg,dword ptr[rsp+r11+offset]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x42;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x10;
+ OpBuffer[obp++]=(char)(0x84 | REGISTER_OPERAND(xmm_reg)<<3);
+ OpBuffer[obp++]=(char)0x1C;
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //movss xmm_reg,dword ptr[rsp+offset]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x10;
+ OpBuffer[obp++]=(char)(0x84 | REGISTER_OPERAND(xmm_reg)<<3);
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add r11,qword ptr[rsp+offset]
+ OpBuffer[obp++]=(char)0x4C;
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0x9C;
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov r11,qword ptr[rsp+offset]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ goto directmem;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+ //movss xmm_reg,dword ptr[r11]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x10;
+ OpBuffer[obp++]=(char)(0x03 | REGISTER_OPERAND(xmm_reg)<<3);
+ }
+}
+
+
+void SetReg_WholeVariable(int type,RELATIVE_VAR *pRelativeVar,int reg){
+ int var_size;
+
+ var_size=GetTypeSize(type,-1);
+
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //mov reg, ptr[r11+offset]
+ op_mov_RM(var_size,reg,REG_R11,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov reg, ptr[offset]
+ op_mov_RM(var_size,reg,0,(int)pRelativeVar->offset,MOD_DISP32);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //mov reg, ptr[rsp+r11+offset]
+ op_mov_RM_ex(var_size,reg,REG_RSP,REG_R11,(int)pRelativeVar->offset,USE_OFFSET);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov reg, ptr[rsp+offset]
+ op_mov_RM(var_size,reg,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add r11,qword ptr[rsp+offset]
+ op_add_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov r11,qword ptr[rsp+offset]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ goto directmem;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+ //mov reg, ptr[r11]
+ op_mov_RM(var_size,reg,REG_R11,0,MOD_BASE);
+ }
+}
Index: /BasicCompiler64/Compile_CallProc.cpp
===================================================================
--- /BasicCompiler64/Compile_CallProc.cpp (revision 3)
+++ /BasicCompiler64/Compile_CallProc.cpp (revision 3)
@@ -0,0 +1,552 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+//ローカル変数アドレススケジュール
+DWORD *pLocalVarAddrSchedule;
+int LocalVarAddrScheduleNum;
+
+void Call_DebugSys_SaveContext(){
+ //call _System_GetEip
+ extern SUBINFO *pSub_System_GetEip;
+ op_call(pSub_System_GetEip);
+
+ //mov rdx,rax
+ op_mov64_ToReg_FromReg(REG_RDX,REG_RAX);
+
+ //mov rcx,rsp
+ op_mov64_ToReg_FromReg(REG_RCX,REG_RSP);
+
+ //call _DebugSys_SaveContext
+ extern SUBINFO *pSub_DebugSys_SaveContext;
+ op_call(pSub_DebugSys_SaveContext);
+}
+
+void AddLocalVarAddrSchedule(){
+ extern HANDLE hHeap;
+
+ //ローカル変数アドレススケジュールに追加する
+ pLocalVarAddrSchedule=(DWORD *)HeapReAlloc(hHeap,0,pLocalVarAddrSchedule,(LocalVarAddrScheduleNum+1)*sizeof(DWORD));
+ pLocalVarAddrSchedule[LocalVarAddrScheduleNum]=obp;
+ LocalVarAddrScheduleNum++;
+}
+
+int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
+ int ret_type;
+
+ if(idProc==PROC_DEFAULT){
+ /////////////////////
+ // ユーザー定義関数
+ /////////////////////
+
+ SUBINFO *psi;
+ psi=(SUBINFO *)pInfo;
+
+ //GetSubHash内でエラー提示が行われた場合
+ if(psi==(SUBINFO *)-1) return -1;
+
+
+ //オブジェクト名を取得
+ char ObjectName[VN_SIZE];
+ int RefType;
+ GetObjectName(name,ObjectName,&RefType);
+
+
+ ////////////////////////
+ // オーバーロードを解決
+ ////////////////////////
+
+ SUBINFO **ppsi;
+ int num;
+ ppsi=GetOverloadSubHash(name,&num);
+ if(num){
+ //オーバーロードを解決
+ psi=OverloadSolutionWithStrParam(name,ppsi,num,Parameter,ObjectName,NULL);
+ HeapDefaultFree(ppsi);
+
+ if(!psi) return 0;
+ }
+
+
+ ret_type=Opcode_CallProc(Parameter,psi,plpRetIndex,0,ObjectName,RefType);
+ }
+ else if(idProc==PROC_DLL){
+ /////////////////////////
+ // DLL関数
+ /////////////////////////
+ DECLAREINFO *pdi;
+ pdi=(DECLAREINFO *)pInfo;
+
+ ret_type=Opcode_CallDllProc(Parameter,pdi,plpRetIndex);
+ }
+ else if(idProc==PROC_BUILTIN){
+ /////////////////////////
+ // 組み込み関数
+ /////////////////////////
+ int FuncId;
+ FuncId=(int)(_int64)pInfo;
+
+ ret_type=Opcode_CallFunc(Parameter,FuncId);
+ }
+ else if(idProc==PROC_PTR){
+ /////////////////
+ // 関数ポインタ
+ /////////////////
+
+ LONG_PTR lpIndex;
+ GetVarType(name,&lpIndex,0);
+
+ extern PROCPTRINFO *pProcPtrInfo;
+ ret_type=Opcode_CallProcPtr(name,Parameter,&pProcPtrInfo[lpIndex],plpRetIndex);
+ }
+
+ return ret_type;
+}
+
+BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
+ //プロパティ用のメソッドを呼び出す
+
+ //配列要素を取得
+ char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+ GetArrayElement(variable,VarName,ArrayElements);
+
+ //オブジェクト名を取得
+ char ObjectName[VN_SIZE];
+ int RefType;
+ GetObjectName(VarName,ObjectName,&RefType);
+
+ //オーバーロード用の関数リストを作成
+ SUBINFO **ppsi;
+ int num;
+ ppsi=GetOverloadSubHash(VarName,&num);
+ if(num==0){
+ return 0;
+ }
+
+ //パラメータを整備
+ char *Parameter;
+ Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(RightSide)+32);
+ lstrcpy(Parameter,ArrayElements);
+ if(RightSide){
+ if(Parameter[0]&&RightSide[0]) lstrcat(Parameter,",");
+ lstrcat(Parameter,RightSide);
+ }
+
+ //オーバーロードを解決
+ SUBINFO *psi;
+ psi=OverloadSolutionWithStrParam(VarName,ppsi,num,Parameter,ObjectName,NULL);
+ HeapDefaultFree(ppsi);
+
+ if(psi){
+ //呼び出し
+ int type;
+ LONG_PTR lpIndex;
+ type=Opcode_CallProc(Parameter,psi,&lpIndex,0,ObjectName,RefType);
+
+ if(pRetTypeInfo){
+ pRetTypeInfo->type=type;
+ pRetTypeInfo->u.lpIndex=lpIndex;
+ }
+ }
+
+ HeapDefaultFree(Parameter);
+
+ return 1;
+}
+
+
+int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex){
+ extern HANDLE hHeap;
+ int i;
+
+
+ extern BOOL bDebugCompile;
+ extern BOOL bDebugSupportProc;
+ if(bDebugCompile&&bDebugSupportProc==0)
+ Call_DebugSys_SaveContext();
+
+
+ ////////////////////////
+ // パラメータのセット
+ ////////////////////////
+
+ //パラメータオブジェクトを生成
+ CParameter *pobj_parameter=0;
+ pobj_parameter=new CParameter(Parameter);
+
+ //エラーチェック
+ pobj_parameter->ErrorCheck(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum);
+
+ //スタックフレームに存在する既存のパラメータをバックアップ
+ pobj_parameter->BackupParameter(pi->ParmNum);
+
+ //レジスタ、スタックフレームにセット
+ pobj_parameter->SetParameter(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum);
+
+
+
+ RELATIVE_VAR RelativeVar;
+ LONG_PTR lp;
+ GetVarOffset(1,variable,&i,&RelativeVar,&lp);
+ SetVarPtrToReg(REG_RAX,&RelativeVar);
+
+ //mov rax,qword ptr[rax]
+ op_mov_RM(sizeof(_int64),REG_RAX,REG_RAX,0,MOD_BASE);
+
+ //call rax
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xD0;
+
+
+ //レジスタのブロッキングを解除 ※パラメータセット時にロックされたレジスタ
+ pobj_BlockReg->clear();
+
+ //スタックフレームに存在する既存のパラメータを復元
+ pobj_parameter->RestoreParameter(pi->ParmNum);
+
+ //パラメータオブジェクトを破棄
+ delete pobj_parameter;
+
+ if(plpIndex) *plpIndex=pi->u.ReturnIndex;
+
+ return pi->ReturnType;
+}
+
+int Opcode_CallProc(char *Parameter,SUBINFO *psi,LONG_PTR *plpIndex,DWORD dwFlags,char *ObjectName,int RefType){
+ int i,i2;
+
+ if(psi->dwType==SUBTYPE_MACRO){
+ if(lstrcmpi(psi->name,"Print")==0){
+ Opcode_Print(Parameter,0);
+ return -1;
+ }
+ if(lstrcmpi(psi->name,"Input")==0){
+ Opcode_Input(Parameter);
+ return -1;
+ }
+ if(lstrcmpi(psi->name,"Write")==0){
+ Opcode_Print(Parameter,1);
+ return -1;
+ }
+ }
+
+ psi->bUse=1;
+
+ BOOL bStatic=0;
+ CClass *pobj_c;
+ if(psi->pobj_ParentClass){
+ //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う
+ if(ObjectName[0]){
+ if(lstrcmpi(ObjectName,"Super")==0){
+ //クラスメンバ関数内からスーパークラスの呼び出し
+ pobj_c=pobj_CompilingClass;
+ }
+ else{
+ pobj_c=pobj_DBClass->check(ObjectName);
+ if(pobj_c){
+ //静的メンバ
+ bStatic=1;
+ }
+ else{
+ //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
+ GetVarType(ObjectName,(LONG_PTR *)&pobj_c,1);
+ }
+ }
+ }
+ else{
+ if(dwFlags&PROCFLAG_NEW){
+ //New演算子によるコンストラクタ呼び出し
+ pobj_c=psi->pobj_ParentClass;
+ }
+ else{
+ //クラスメンバ関数内から同一クラスのメンバ関数の呼び出し
+ pobj_c=pobj_CompilingClass;
+ }
+ }
+
+ DWORD dwAccess;
+ for(i=0;iiMethodNum;i++){
+ if(psi==pobj_c->ppobj_Method[i]->psi) break;
+ }
+ if(i==pobj_c->iMethodNum){
+ for(i=0;iiStaticMethodNum;i++){
+ if(psi==pobj_c->ppobj_StaticMethod[i]->psi) break;
+ }
+ dwAccess=pobj_c->ppobj_StaticMethod[i]->dwAccess;
+
+ bStatic=1;
+ }
+ else dwAccess=pobj_c->ppobj_Method[i]->dwAccess;
+
+
+ //////////////////////////////
+ // アクセスエラーチェック
+ //////////////////////////////
+
+ if(ObjectName[0]){
+ //外部からの呼び出し
+ if(pobj_c==pobj_CompilingClass){
+ //同一クラスオブジェクトの場合はプライベートアクセスを容認する
+ if(dwAccess==ACCESS_NON){
+ SetError(109,psi->name,cp);
+ return -1;
+ }
+ }
+ else{
+ if(dwAccess==ACCESS_PRIVATE||
+ dwAccess==ACCESS_NON){
+ SetError(109,psi->name,cp);
+ return -1;
+ }
+ if(dwAccess==ACCESS_PROTECTED){
+ SetError(110,psi->name,cp);
+ return -1;
+ }
+ }
+ }
+ else{
+ //クラス内部からの呼び出し(継承によるACCESS_NONのみをエラーとする)
+ if(dwAccess==ACCESS_NON){
+ SetError(109,psi->name,cp);
+ return -1;
+ }
+ }
+ }
+
+
+ ///////////////////////////////////////////////////////////////
+ // _System_LocalThis、_System_ReturnObjectのダミーをセット
+ ///////////////////////////////////////////////////////////////
+
+ char temporary[VN_SIZE]={0};
+ if(psi->pobj_ParentClass&&bStatic==0){
+ //_System_LocalThis(第一パラメータ)のダミーを作成
+ lstrcpy(temporary,"0,");
+ }
+
+ if(psi->ReturnType==DEF_OBJECT){
+ //_System_ReturnObject(第一または第二パラメータのダミーを作成)
+ sprintf(temporary+lstrlen(temporary),"%c%c0,",1,ESC_BYVAL);
+ }
+
+ if(Parameter[0]=='\0'&&temporary[0])
+ temporary[lstrlen(temporary)-1]=0;
+ else lstrcat(temporary,Parameter);
+
+
+ ////////////////////////
+ // パラメータをセット
+ ////////////////////////
+
+ //パラメータオブジェクトを生成
+ CParameter *pobj_parameter=0;
+ pobj_parameter=new CParameter(temporary);
+
+ //エラーチェック
+ pobj_parameter->ErrorCheck(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->SecondParmNum);
+
+ if(psi->dwType==SUBTYPE_MACRO){
+ //マクロ関数の場合は、パラメータ省略を考慮する
+ pobj_parameter->MacroParameterSupport(psi->pRealParmInfo);
+ }
+
+ //スタックフレームに存在する既存のパラメータをバックアップ
+ pobj_parameter->BackupParameter(psi->RealParmNum);
+
+ //レジスタ、スタックフレームにセット
+ pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum);
+
+
+ if(psi->ReturnType==DEF_OBJECT){
+ //////////////////////////////////////////////////////
+ // 戻り値にオブジェクト インスタンスを持つ場合
+ // ※ByRef _System_ReturnObject パラメータをセット
+ //////////////////////////////////////////////////////
+
+
+ //////////////////////////////////////////////////////
+ ///// レジスタ資源のバックアップ
+ { BACKUP_REGISTER_RESOURCE
+ //////////////////////////////////////////////////////
+
+ int object_size;
+ object_size=GetSizeOfClass(psi->u.Return_pobj_c);
+
+ //mov rcx,object_size
+ op_mov_RV(sizeof(_int64),REG_RCX,object_size);
+
+ //call calloc
+ extern SUBINFO *pSub_calloc;
+ op_call(pSub_calloc);
+
+ //mov r13,rax
+ op_mov_RR(REG_R13,REG_RAX);
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+
+ if(psi->pobj_ParentClass&&bStatic==0){
+ //mov rdx,r13
+ op_mov_RR(REG_RDX,REG_R13);
+ }
+ else{
+ //mov rcx,r13
+ op_mov_RR(REG_RCX,REG_R13);
+ }
+ }
+
+
+ if(psi->pobj_ParentClass&&bStatic==0){
+ ///////////////////////////////
+ // メンバ関数の場合
+ // thisポインタをrcxで受け渡す
+ ///////////////////////////////
+
+ if(ObjectName[0]){
+ if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember;
+ else{
+ RELATIVE_VAR RelativeVar;
+ if(!GetVarOffset(1,ObjectName,&i2,&RelativeVar,0)) return -1;
+ SetVarPtrToReg(REG_RCX,&RelativeVar);
+
+ //参照タイプが整合しているかをチェック
+ if(i2!=RefType) SetError(104,ObjectName,cp);
+
+ if(i2==DEF_PTR_OBJECT){
+ //mov rcx,qword ptr[rcx]
+ op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE);
+ }
+ }
+ }
+ else{
+InClassMember:
+ if(dwFlags&PROCFLAG_NEW){
+ //New演算子によるコンストラクタ呼び出しの場合
+
+ //mov rcx,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->ref(REG_RCX);
+ }
+ else{
+ //自身のオブジェクトのThisポインタをrcxにコピー
+ SetThisPtrToReg(REG_RCX);
+ }
+ }
+ }
+
+ if(psi->bVirtual){
+ //仮想関数(オブジェクトメソッド)呼び出し
+ //pObj->func_table->func1
+ // ->func2
+ // ->func3
+
+ //mov r11,qword ptr[rcx]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
+
+ for(i=0,i2=0;iiMethodNum;i++){
+ if(pobj_c->ppobj_Method[i]->psi==psi) break;
+ if(pobj_c->ppobj_Method[i]->psi->bVirtual) i2++;
+ }
+
+ //call qword ptr[r11+func_index]
+ if(i2*PTR_SIZE<=0x7F){
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x53;
+ OpBuffer[obp++]=(char)(i2*PTR_SIZE);
+ }
+ else{
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x93;
+ *((long *)(OpBuffer+obp))=i2*PTR_SIZE;
+ obp+=sizeof(long);
+ }
+ }
+ else{
+ //通常呼び出し
+
+ //call ProcAddr
+ op_call(psi);
+ }
+
+ /* 64コンパイラでは不要
+ if(pdi->bCdecl){
+ //add esp,ParmSize
+ }*/
+
+
+ //レジスタのブロッキングを解除 ※パラメータセット時にロックされたレジスタ
+ pobj_BlockReg->clear();
+
+ //スタックフレームに存在する既存のパラメータを復元
+ pobj_parameter->RestoreParameter(psi->RealParmNum);
+
+ //パラメータオブジェクトを破棄
+ delete pobj_parameter;
+
+ if(plpIndex) *plpIndex=psi->u.ReturnIndex;
+
+ return psi->ReturnType;
+}
+
+int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex){
+ char *temporary;
+
+ temporary=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter)+1);
+
+ extern BOOL bDebugCompile;
+ extern BOOL bDebugSupportProc;
+ if(bDebugCompile&&bDebugSupportProc==0&&lstrcmp(pdi->name,"DebugBreak")!=0)
+ Call_DebugSys_SaveContext();
+
+ pdi->bUse=1;
+
+
+ ////////////////////////
+ // パラメータのセット
+ ////////////////////////
+
+ //パラメータオブジェクトを生成
+ CParameter *pobj_parameter=0;
+ pobj_parameter=new CParameter(Parameter);
+
+ //エラーチェック
+ pobj_parameter->ErrorCheck(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum);
+
+ //スタックフレームに存在する既存のパラメータをバックアップ
+ pobj_parameter->BackupParameter(pdi->ParmNum);
+
+ //レジスタ、スタックフレームにセット
+ pobj_parameter->SetParameter(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum);
+
+
+ //レジスタのブロッキングを解除 ※パラメータセット時にロックされたレジスタ
+ pobj_BlockReg->clear();
+
+
+ //動的リンクされたプロシージャの呼び出し
+
+ //call dword ptr[ImportTable]
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0x15;
+ pobj_ImportAddrSchedule->add(pdi);
+ obp+=sizeof(long);
+
+ /* 64コンパイラでは不要
+ if(pdi->bCdecl){
+ //add esp,ParmSize
+ }*/
+
+ //スタックフレームに存在する既存のパラメータを復元
+ pobj_parameter->RestoreParameter(pdi->ParmNum);
+
+ //パラメータオブジェクトを破棄
+ delete pobj_parameter;
+
+ if(plpIndex) *plpIndex=pdi->u.ReturnIndex;
+
+ HeapDefaultFree(temporary);
+
+ return pdi->ReturnType;
+}
Index: /BasicCompiler64/Compile_Func.cpp
===================================================================
--- /BasicCompiler64/Compile_Func.cpp (revision 3)
+++ /BasicCompiler64/Compile_Func.cpp (revision 3)
@@ -0,0 +1,283 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+int GetFunctionType(int FuncNum){
+ switch(FuncNum){
+ case FUNC_LEN:
+ return DEF_LONG;
+ case FUNC_SIZEOF:
+ return DEF_LONG;
+ case FUNC_ADDRESSOF:
+ case FUNC_VARPTR:
+ return DEF_PTR_VOID;
+ case FUNC_GETDOUBLE:
+ return DEF_DOUBLE;
+ case FUNC_GETSINGLE:
+ return DEF_SINGLE;
+ case FUNC_GETQWORD:
+ return DEF_QWORD;
+ case FUNC_GETDWORD:
+ return DEF_DWORD;
+ case FUNC_GETWORD:
+ return DEF_WORD;
+ case FUNC_GETBYTE:
+ return DEF_BYTE;
+ }
+ return 0;
+}
+int GetFunctionFromName(char *FuncName){
+ if(lstrcmpi(FuncName,"Len")==0) return FUNC_LEN;
+ if(lstrcmpi(FuncName,"AddressOf")==0) return FUNC_ADDRESSOF;
+ if(lstrcmpi(FuncName,"SizeOf")==0) return FUNC_SIZEOF;
+ if(lstrcmpi(FuncName,"VarPtr")==0) return FUNC_VARPTR;
+ if(lstrcmpi(FuncName,"GetDouble")==0) return FUNC_GETDOUBLE;
+ if(lstrcmpi(FuncName,"GetSingle")==0) return FUNC_GETSINGLE;
+ if(lstrcmpi(FuncName,"GetQWord")==0) return FUNC_GETQWORD;
+ if(lstrcmpi(FuncName,"GetDWord")==0) return FUNC_GETDWORD;
+ if(lstrcmpi(FuncName,"GetWord")==0) return FUNC_GETWORD;
+ if(lstrcmpi(FuncName,"GetByte")==0) return FUNC_GETBYTE;
+ return 0;
+}
+void Opcode_Func_Len(char *Parameter){
+ int type,TypeSize;
+ LONG_PTR lpIndex;
+ BOOL bArrayHead;
+
+ type=GetVarType(Parameter,&lpIndex,0);
+
+ char *tempParm=Parameter;
+ char temporary[VN_SIZE];
+ char temp2[32];
+ if(type==-1){
+ sprintf(temporary,"_System_DummyStr2=%s",Parameter);
+ OpcodeCalc(temporary);
+
+ lstrcpy(temp2,"_System_DummyStr2");
+ tempParm=temp2;
+
+ extern CClass *pobj_StringClass;
+ type=DEF_OBJECT;
+ lpIndex=(LONG_PTR)pobj_StringClass;
+ }
+
+ TYPEINFO TypeInfo={type,lpIndex};
+ if(IsStringObjectType(&TypeInfo)){
+ //Stringオブジェクトの場合
+ sprintf(temporary,"%s.Length",tempParm);
+
+ int reg=REG_RAX;
+ NumOpe(®,temporary,0,0,NULL,NULL);
+ return;
+ }
+
+
+ int SubScripts[MAX_ARRAYDIM];
+ RELATIVE_VAR RelativeVar;
+ if(!GetVarOffset(1,tempParm,&type,&RelativeVar,&lpIndex,SubScripts)) return;
+
+
+ if(type&FLAG_PTR){
+ type&=~FLAG_PTR;
+
+ bArrayHead=1;
+ }
+ else bArrayHead=0;
+
+ TypeSize=GetTypeSize(type,lpIndex);
+
+ if(bArrayHead) TypeSize*=JumpSubScripts(SubScripts);
+
+ //mov rax,TypeSize
+ op_mov_RV(sizeof(_int64),REG_RAX,TypeSize);
+
+ return;
+}
+void Opcode_Func_AddressOf(char *name){
+ extern int cp;
+ SUBINFO *psi;
+
+ extern LONG_PTR ProcPtr_BaseIndex;
+ if(ProcPtr_BaseIndex!=-1){
+ //左辺の型にのっとり、オーバーロードを解決
+
+ SUBINFO **ppsi;
+ int num;
+ ppsi=GetOverloadSubHash(name,&num);
+ if(!num){
+ HeapDefaultFree(ppsi);
+
+ SetError(27,name,cp);
+ return;
+ }
+
+ //オーバーロードを解決
+ extern PROCPTRINFO *pProcPtrInfo;
+ psi=OverloadSolution(name,ppsi,num,pProcPtrInfo[ProcPtr_BaseIndex].pParmInfo,pProcPtrInfo[ProcPtr_BaseIndex].ParmNum,NULL);
+ HeapDefaultFree(ppsi);
+
+ if(!psi){
+ SetError(27,name,cp);
+ return;
+ }
+ }
+ else{
+ psi=GetSubHash(name);
+ if(!psi){
+ SetError(27,name,cp);
+ return;
+ }
+ }
+
+
+ if(psi->bVirtual){
+ ///////////////////////////////
+ // 仮想関数の場合
+ // thisポインタをrcxにコピー
+ ///////////////////////////////
+
+ CClass *pobj_c;
+
+ char ObjectName[VN_SIZE];
+ int RefType;
+ GetObjectName(name,ObjectName,&RefType);
+
+ if(ObjectName[0]){
+ if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember;
+ else{
+ RELATIVE_VAR RelativeVar;
+ int type;
+ if(!GetVarOffset(1,ObjectName,&type,&RelativeVar,(LONG_PTR *)&pobj_c)) return;
+ SetVarPtrToReg(REG_RCX,&RelativeVar);
+
+ //参照タイプが整合しているかをチェック
+ if(type!=RefType) SetError(104,ObjectName,cp);
+
+ if(type==DEF_PTR_OBJECT){
+ //mov rcx,qword ptr[rcx]
+ op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE);
+ }
+ }
+ }
+ else{
+InClassMember:
+ //自身のオブジェクトのThisポインタをrcxにコピー
+ SetThisPtrToReg(REG_RCX);
+
+ pobj_c=pobj_CompilingClass;
+ }
+
+
+ //仮想関数(オブジェクトメソッド)
+ //pObj->func_table->func1
+ // ->func2
+ // ->func3
+
+ //mov r11,qword ptr[rcx]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
+
+ int i,i2;
+ for(i=0,i2=0;iiMethodNum;i++){
+ if(pobj_c->ppobj_Method[i]->psi==psi) break;
+ if(pobj_c->ppobj_Method[i]->psi->bVirtual) i2++;
+ }
+
+ //mov rax,qword ptr[r11+func_index]
+ if(i2*PTR_SIZE<=0x7F){
+ op_mov_RM(sizeof(_int64),REG_RAX,REG_R11,i2*PTR_SIZE,MOD_BASE_DISP8);
+ }
+ else{
+ op_mov_RM(sizeof(_int64),REG_RAX,REG_R11,i2*PTR_SIZE,MOD_BASE_DISP32);
+ }
+ }
+ else{
+ //一般の関数
+
+ //mov rax,ProcAddr
+ op_mov_RV(sizeof(_int64),REG_RAX,0);
+ obp-=sizeof(long);
+ pobj_SubAddrSchedule->add(psi,0);
+ obp+=sizeof(long);
+ }
+
+ psi->bUse=1;
+}
+void Opcode_Func_SizeOf(char *Parameter){
+ int type,size;
+ LONG_PTR lpIndex;
+
+ type=GetTypeFixed(Parameter,&lpIndex);
+ size=GetTypeSize(type,lpIndex);
+
+ //mov rax,size
+ op_mov_RV(sizeof(_int64),REG_RAX,size);
+}
+void Opcode_Func_VarPtr(char *Parameter){
+ int type;
+ RELATIVE_VAR RelativeVar;
+
+ //変数のアドレスを取得
+ if(!GetVarOffset(1,Parameter,&type,&RelativeVar,0)) return;
+
+ SetVarPtrToReg(REG_RAX,&RelativeVar);
+}
+void Opcode_Func_GetPtrData(char *Parameter,int type){
+ int i2;
+
+ int reg=REG_RAX;
+ i2=NumOpe(®,Parameter,0,0,0);
+ if(!IsWholeNumberType(i2)){
+ extern int cp;
+ SetError(11,Parameter,cp);
+ return;
+ }
+
+ if(type==DEF_DOUBLE){
+ //movlpd xmm0,qword ptr[rax]
+ op_movlpd_RM(REG_XMM0,REG_RAX,0,MOD_BASE);
+ }
+ else if(type==DEF_SINGLE){
+ //movss xmm0,dword ptr[rax]
+ op_movss_RM(REG_XMM0,REG_RAX,0,MOD_BASE);
+ }
+ else{
+ //mov rax,ptr[rax]
+ op_mov_RM(GetTypeSize(type,-1),REG_RAX,REG_RAX,0,MOD_BASE);
+ }
+}
+
+int Opcode_CallFunc(char *Parameter,int FuncNum){
+ switch(FuncNum){
+ case FUNC_LEN:
+ Opcode_Func_Len(Parameter);
+ return DEF_LONG;
+ case FUNC_ADDRESSOF:
+ Opcode_Func_AddressOf(Parameter);
+ return DEF_PTR_VOID;
+ case FUNC_SIZEOF:
+ Opcode_Func_SizeOf(Parameter);
+ return DEF_LONG;
+ case FUNC_VARPTR:
+ Opcode_Func_VarPtr(Parameter);
+ return DEF_PTR_VOID;
+
+ case FUNC_GETDOUBLE:
+ Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
+ return DEF_DOUBLE;
+ case FUNC_GETSINGLE:
+ Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
+ return DEF_SINGLE;
+ case FUNC_GETQWORD:
+ Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
+ return DEF_QWORD;
+ case FUNC_GETDWORD:
+ Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
+ return DEF_DWORD;
+ case FUNC_GETWORD:
+ Opcode_Func_GetPtrData(Parameter,DEF_WORD);
+ return DEF_WORD;
+ case FUNC_GETBYTE:
+ Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
+ return DEF_BYTE;
+ }
+ return 0;
+}
Index: /BasicCompiler64/Compile_Object.cpp
===================================================================
--- /BasicCompiler64/Compile_Object.cpp (revision 3)
+++ /BasicCompiler64/Compile_Object.cpp (revision 3)
@@ -0,0 +1,316 @@
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+void CallConstructor(CClass *pobj_c,char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
+ ////////////////////////////
+ // コンストラクタの呼び出し
+ ////////////////////////////
+
+ //この関数を使用する場合は、
+ //・ebxにオブジェクトの個数(複数個の場合のみ)
+ //・スタックフレームの先頭参照位置に先頭Thisポインタ
+ //をセットしておかなければならない
+
+ int jnz_back;
+
+
+ //jnzの番地
+ jnz_back=obp;
+
+ if(bSomeObjects){
+ //mov qword ptr[rsp+offset],rbx ※スタックフレームを利用
+ pobj_sf->push(REG_RBX);
+
+ // ※ここでプッシュされた値はコンストラクタのthisポインタとなる
+ //mov qword ptr[rsp+offset],rax ※スタックフレームを利用
+ pobj_sf->push(REG_RAX);
+ }
+
+
+ ////////////////////////
+ // オーバーロードを解決
+ ////////////////////////
+
+ SUBINFO **ppsi;
+ SUBINFO *psi;
+ int num;
+ ppsi=GetOverloadObjectSubHash(pobj_c->name,pobj_c,&num);
+ if(num){
+ //オーバーロードを解決
+ psi=OverloadSolutionWithStrParam(pobj_c->name,
+ ppsi,num,CreateParameter,"",NULL);
+ HeapDefaultFree(ppsi);
+
+ if(!psi) return;
+ }
+
+ //コンストラクタを呼び出す
+ Opcode_CallProc(CreateParameter,
+ psi,
+ 0,
+ PROCFLAG_NEW,"",0);
+
+ if(bSomeObjects){
+ //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_RAX);
+
+ //mov rbx,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_RBX);
+
+ //add eax,TypeSize
+ OpBuffer[obp++]=(char)0x05;
+ *((long *)(OpBuffer+obp))=ObjectSize;
+ obp+=sizeof(long);
+
+ //sub ebx,1
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xEB;
+ OpBuffer[obp++]=(char)0x01;
+
+ //jnz ↑
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=jnz_back-(obp+sizeof(long));
+ obp+=sizeof(long);
+ }
+}
+int Operator_New(char *Parameter,LONG_PTR *plpIndex){
+ char TypeName[VN_SIZE],CreateParameter[VN_SIZE],ObjectSize[VN_SIZE];
+ int i,i2;
+ int reg;
+
+ i=0;
+
+ if(Parameter[0]=='['){
+ i=GetStringInBracket(ObjectSize,Parameter);
+
+ SlideString(ObjectSize+1,-1);
+ ObjectSize[i-2]=0;
+ }
+ else ObjectSize[0]=0;
+
+ for(i2=0;;i++,i2++){
+ if(Parameter[i]=='('){
+ TypeName[i2]=0;
+
+ //コンストラクタに渡すパラメータを取得
+ i2=GetStringInPare(CreateParameter,Parameter+i);
+ RemoveStringPare(CreateParameter);
+ i+=i2;
+ if(Parameter[i]!='\0'){
+ SetError(42,NULL,cp);
+ return 0;
+ }
+ break;
+ }
+ TypeName[i2]=Parameter[i];
+ if(Parameter[i]=='\0'){
+ CreateParameter[0]=0;
+ break;
+ }
+ }
+
+ int type,TypeSize;
+ type=GetTypeFixed(TypeName,plpIndex);
+ if(type==-1){
+ SetError(3,TypeName,cp);
+ return 0;
+ }
+ TypeSize=GetTypeSize(type,*plpIndex);
+
+ if(type!=DEF_OBJECT){
+ ////////////////////////
+ // 通常のデータ型の場合
+ ////////////////////////
+
+ SetError(121,NULL,cp);
+ return 0;
+ }
+
+ CClass *pobj_c;
+ pobj_c=(CClass *)*plpIndex;
+
+ if(pobj_c->IsHoldAbstractFunction()){
+ //抽象クラスだったとき
+ SetError(125,pobj_c->name,cp);
+ }
+
+ BOOL bSomeObjects=0;
+ if(ObjectSize[0]){
+ bSomeObjects=1;
+
+ reg=REG_RAX;
+ i2=NumOpe(®,ObjectSize,0,0,0);
+ if(!IsWholeNumberType(i2)) SetError(49,NULL,cp);
+
+ //※添え字上限値であることを考慮
+ //add rax,1
+ op_add64_value(REG_RAX,1);
+
+ //オブジェクトの個数をrbxに一時保持
+ //※rbxは関数が呼ばれても不変
+ //mov rbx,rax
+ op_mov64_ToReg_FromReg(REG_RBX,REG_RAX);
+
+ //imul rax,size
+ op_imul_value(sizeof(_int64),REG_RAX,TypeSize);
+
+ //add rax,PTR_SIZE*3
+ op_add64_value(REG_RAX,PTR_SIZE*3);
+
+ //mov rcx,rax
+ op_mov64_ToReg_FromReg(REG_RCX,REG_RAX);
+ }
+ else{
+ //オブジェクトの個数をrbxに一時保持
+ //※rbxは関数が呼ばれても不変
+ //mov rbx,1
+ op_mov_RV(sizeof(_int64),REG_RBX,1);
+
+ //mov rcx,TypeSize+PTR_SIZE*3
+ op_mov_RV(sizeof(_int64),REG_RCX,TypeSize+PTR_SIZE*3);
+ }
+
+ //call calloc
+ extern SUBINFO *pSub_calloc;
+ op_call(pSub_calloc);
+
+
+ /*
+ 確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、
+ pPtr-=sizeof(DWORD)*3
+ pPtr[0]=オブジェクトの個数
+ pPtr[1]=オブジェクトのサイズ
+ pPtr[2]=デストラクタの関数ポインタ
+ */
+
+
+ //mov qword ptr[rax],rbx(オブジェクトの個数)
+ op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE);
+
+ //add rax,PTR_SIZE
+ op_add64_value(REG_RAX,PTR_SIZE);
+
+
+ //mov qword ptr[rax],TypeSize(オブジェクトのサイズ)
+ op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,TypeSize);
+
+ //add rax,PTR_SIZE
+ op_add64_value(REG_RAX,PTR_SIZE);
+
+
+ i2=pobj_c->DestructorMemberSubIndex;
+ if(i2==-1) return 0;
+
+ //mov rcx,DestructorProcAddr
+ op_mov_RV(sizeof(_int64),REG_RCX,0);
+ obp-=sizeof(long);
+ pobj_SubAddrSchedule->add(pobj_c->ppobj_Method[i2]->psi,0);
+ pobj_c->ppobj_Method[i2]->psi->bUse=1;
+ obp+=sizeof(long);
+
+ //mov qword ptr[rax],rcx
+ op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE);
+
+ //add rax,PTR_SIZE
+ op_add64_value(REG_RAX,PTR_SIZE);
+
+
+ // ※ここでプッシュされた値はNew演算子の戻り値となる
+ //mov qword ptr[rsp+offset],rax ※スタックフレームを利用
+ pobj_sf->push(REG_RAX);
+
+
+ /////////////////////////////////////////////////////////////////////
+
+ ////////////////////////////
+ // コンストラクタの呼び出し
+ ////////////////////////////
+
+ CallConstructor(pobj_c,CreateParameter,TypeSize,bSomeObjects);
+
+
+ //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_RAX);
+
+ return DEF_PTR_OBJECT;
+}
+
+void OpcodeDelete(char *Parameter){
+ int type;
+
+ int reg=REG_RAX;
+ type=NumOpe(®,Parameter,0,0,0);
+ if(type==-1) return;
+ if(!(type==DEF_PTR_OBJECT||type==DEF_PTR_VOID)) SetError(122,NULL,cp);
+
+ //sub rax,PTR_SIZE*3
+ op_sub_RV(sizeof(_int64),REG_RAX,PTR_SIZE*3);
+
+ //mov qword ptr[rsp+offset],rax ※スタックフレームを利用
+ pobj_sf->push(REG_RAX);
+
+
+ //mov rbx,qword ptr[rax](オブジェクトの個数)
+ op_mov_RM(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE);
+
+ //add rax,PTR_SIZE
+ op_add64_value(REG_RAX,PTR_SIZE);
+
+
+ //mov rsi,qword ptr[rax](オブジェクトのサイズ)
+ op_mov_RM(sizeof(_int64),REG_RSI,REG_RAX,0,MOD_BASE);
+
+ //add rax,PTR_SIZE
+ op_add64_value(REG_RAX,PTR_SIZE);
+
+
+ //mov rdi,qword ptr[rax](デストラクタの関数ポインタ)
+ op_mov_RM(sizeof(_int64),REG_RDI,REG_RAX,0,MOD_BASE);
+
+ //add rax,PTR_SIZE
+ op_add64_value(REG_RAX,PTR_SIZE);
+
+
+ //mov rcx,rax
+ op_mov64_ToReg_FromReg(REG_RCX,REG_RAX);
+
+
+ //jnzの番地
+ int jnz_back;
+ jnz_back=obp;
+
+ //mov qword ptr[rsp+offset],rax ※スタックフレームを利用
+ pobj_sf->push(REG_RAX);
+
+ //call rdi
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xD7;
+
+ //mov rcx,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_RCX);
+
+ //add rcx,rsi
+ op_add64_reg(REG_RCX,REG_RSI);
+
+ //sub rbx,1
+ op_sub_RV(sizeof(_int64),REG_RBX,1);
+
+ //jnz ↑
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x85;
+ *((long *)(OpBuffer+obp))=jnz_back-(obp+sizeof(long));
+ obp+=sizeof(long);
+
+
+ //////////////////////////////////////////
+ // オブジェクトメンバ変数用のメモリを解放
+ //////////////////////////////////////////
+
+ //mov rcx,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_RCX);
+
+ //call free
+ extern SUBINFO *pSub_free;
+ op_call(pSub_free);
+}
Index: /BasicCompiler64/Compile_ProcOp.cpp
===================================================================
--- /BasicCompiler64/Compile_ProcOp.cpp (revision 3)
+++ /BasicCompiler64/Compile_ProcOp.cpp (revision 3)
@@ -0,0 +1,868 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void SystemProc(char *name){
+ if(lstrcmp(name,"_System_GetEip")==0){
+ //mov rax,qword ptr[rsp]
+ op_mov_RM(sizeof(_int64),REG_RAX,REG_RSP,0,MOD_BASE);
+
+ //ret
+ OpBuffer[obp++]=(char)0xC3;
+ }
+ else if(lstrcmp(name,"_System_InitDllGlobalVariables")==0){
+ ////////////////////////////////////////
+ // DLLのグローバル領域をコンパイル
+ ////////////////////////////////////////
+ extern BOOL bDll;
+ if(!bDll){
+ //ret
+ OpBuffer[obp++]=(char)0xC3;
+
+ return;
+ }
+
+ extern BOOL bCompilingGlobal;
+ BOOL bBackCompilingGlobal;
+ bBackCompilingGlobal=bCompilingGlobal;
+ bCompilingGlobal=1;
+
+ int BackCp;
+ BackCp=cp;
+ cp=-1;
+
+ //sub rsp,スタックフレームサイズ
+ int StackFrameSchedule;
+ op_sub_rsp(0xFFFFFFFF);
+ StackFrameSchedule=obp-sizeof(long);
+
+ extern BOOL bDebugCompile;
+ if(bDebugCompile){
+ //デバッグ用の変数を定義
+ DebugVariable();
+ }
+
+ //GC用の変数を定義
+ InitGCVariables();
+
+ GetGlobalDataForDll();
+
+ //add rsp,スタックフレームサイズ
+ op_add64_value(REG_RSP,pobj_sf->GetFrameSize());
+
+ //スタックフレームスケジュール(subコマンドに渡す値)
+ *((long *)(OpBuffer+StackFrameSchedule))=pobj_sf->GetFrameSize();
+
+ bCompilingGlobal=bBackCompilingGlobal;
+ cp=BackCp;
+
+ //ret
+ OpBuffer[obp++]=(char)0xC3;
+ }
+ else if(lstrcmp(name,"_System_InitStaticLocalVariables")==0){
+ //静的ローカルオブジェクトのコンストラクタ呼び出し
+
+ //sub rsp,スタックフレームサイズ
+ int StackFrameSchedule;
+ op_sub_rsp(0xFFFFFFFF);
+ StackFrameSchedule=obp-sizeof(long);
+
+ extern int MaxGlobalVarNum;
+ extern VARIABLE *GlobalVar;
+ int i;
+ for(i=0;iGetFrameSize());
+
+ //スタックフレームスケジュール(subコマンドに渡す値)
+ *((long *)(OpBuffer+StackFrameSchedule))=pobj_sf->GetFrameSize();
+
+ //ret
+ OpBuffer[obp++]=(char)0xC3;
+ }
+ else if(lstrcmp(name,"_System_Call_Destructor_of_GlobalObject")==0){
+ //sub rsp,8(※RSPを16バイト境界にあわせるため)
+ op_sub_rsp(0x8);
+
+
+ extern BOOL bCompilingGlobal;
+ BOOL bBackCompilingGlobal;
+ bBackCompilingGlobal=bCompilingGlobal;
+ bCompilingGlobal=1;
+
+ CallDestrouctorsOfScope();
+
+ bCompilingGlobal=bBackCompilingGlobal;
+
+
+ //add rsp,8
+ op_add64_value(REG_RSP,0x8);
+
+ //ret
+ OpBuffer[obp++]=(char)0xC3;
+ }
+ else if(lstrcmp(name,"_System_GetSp")==0){
+ //mov rax,rsp
+ op_mov_RR(REG_RAX,REG_RSP);
+
+ //add rax,PTR_SIZE
+ op_add64_value(REG_RAX,PTR_SIZE);
+
+ //ret
+ OpBuffer[obp++]=(char)0xC3;
+ }
+ else if(lstrcmp(name,"_allrem")==0){
+ //乗除演算用の特殊関数(64ビット整数対応)
+ BYTE Buffer_allrem[]={
+ 0x53,0x57,0x33,0xFF,0x8B,0x44,0x24,0x10,0x0B,0xC0,0x7D,0x14,0x47,0x8B,0x54,0x24,0x0C,0xF7,0xD8,0xF7,0xDA,0x83,0xD8,0x00,0x89,0x44,0x24,0x10,0x89,0x54,0x24,0x0C,0x8B,0x44,0x24,0x18,0x0B,0xC0,0x7D,0x13,0x8B,0x54,0x24,0x14,0xF7,0xD8,0xF7,0xDA,0x83,0xD8,0x00,0x89,0x44,0x24,0x18,0x89,0x54,0x24,0x14,0x0B,0xC0,0x75,0x1B,0x8B,0x4C,0x24,0x14,0x8B,0x44,0x24,0x10,0x33,0xD2,0xF7,0xF1,0x8B,0x44,0x24,0x0C,0xF7,0xF1,0x8B,0xC2,0x33,0xD2,0x4F,0x79,0x4E,0xEB,0x53,0x8B,0xD8,0x8B,0x4C,0x24,0x14,0x8B,0x54,0x24,0x10,0x8B,0x44,0x24,0x0C,0xD1,0xEB,0xD1,0xD9,0xD1,0xEA,0xD1,0xD8,0x0B,0xDB,0x75,0xF4,0xF7,0xF1,0x8B,0xC8,0xF7,0x64,0x24,0x18,0x91,0xF7,0x64,0x24,0x14,0x03,0xD1,0x72,0x0E,0x3B,0x54,0x24,0x10,0x77,0x08,0x72,0x0E,0x3B,0x44,0x24,0x0C,0x76,0x08,0x2B,0x44,0x24,0x14,0x1B,0x54,0x24,0x18,0x2B,0x44,0x24,0x0C,0x1B,0x54,0x24,0x10,0x4F,0x79,0x07,0xF7,0xDA,0xF7,0xD8,0x83,0xDA,0x00,0x5F,0x5B,0xC2,0x10,0x00
+ };
+
+ memcpy(OpBuffer+obp,Buffer_allrem,178);
+ obp+=178;
+ }
+ else if(lstrcmp(name,"_allmul")==0){
+ //乗算用の特殊関数(64ビット整数対応)
+ BYTE Buffer_allmul[]={
+ 0x8B,0x44,0x24,0x08,0x8B,0x4C,0x24,0x10,0x0B,0xC8,0x8B,0x4C,0x24,0x0C,0x75,0x09,0x8B,0x44,0x24,0x04,0xF7,0xE1,0xC2,0x10,0x00,0x53,0xF7,0xE1,0x8B,0xD8,0x8B,0x44,0x24,0x08,0xF7,0x64,0x24,0x14,0x03,0xD8,0x8B,0x44,0x24,0x08,0xF7,0xE1,0x03,0xD3,0x5B,0xC2,0x10,0x00
+ };
+
+ memcpy(OpBuffer+obp,Buffer_allmul,52);
+ obp+=52;
+ }
+ else if(lstrcmp(name,"_alldiv")==0){
+ //除算用の特殊関数(64ビット整数対応)
+ BYTE Buffer_alldiv[]={
+ 0x57,0x56,0x53,0x33,0xFF,0x8B,0x44,0x24,0x14,0x0B,0xC0,0x7D,0x14,0x47,0x8B,0x54,0x24,0x10,0xF7,0xD8,0xF7,0xDA,0x83,0xD8,0x00,0x89,0x44,0x24,0x14,0x89,0x54,0x24,0x10,0x8B,0x44,0x24,0x1C,0x0B,0xC0,0x7D,0x14,0x47,0x8B,0x54,0x24,0x18,0xF7,0xD8,0xF7,0xDA,0x83,0xD8,0x00,0x89,0x44,0x24,0x1C,0x89,0x54,0x24,0x18,0x0B,0xC0,0x75,0x18,0x8B,0x4C,0x24,0x18,0x8B,0x44,0x24,0x14,0x33,0xD2,0xF7,0xF1,0x8B,0xD8,0x8B,0x44,0x24,0x10,0xF7,0xF1,0x8B,0xD3,0xEB,0x41,0x8B,0xD8,0x8B,0x4C,0x24,0x18,0x8B,0x54,0x24,0x14,0x8B,0x44,0x24,0x10,0xD1,0xEB,0xD1,0xD9,0xD1,0xEA,0xD1,0xD8,0x0B,0xDB,0x75,0xF4,0xF7,0xF1,0x8B,0xF0,0xF7,0x64,0x24,0x1C,0x8B,0xC8,0x8B,0x44,0x24,0x18,0xF7,0xE6,0x03,0xD1,0x72,0x0E,0x3B,0x54,0x24,0x14,0x77,0x08,0x72,0x07,0x3B,0x44,0x24,0x10,0x76,0x01,0x4E,0x33,0xD2,0x8B,0xC6,0x4F,0x75,0x07,0xF7,0xDA,0xF7,0xD8,0x83,0xDA,0x00,0x5B,0x5E,0x5F,0xC2,0x10,0x00
+ };
+
+ memcpy(OpBuffer+obp,Buffer_alldiv,170);
+ obp+=170;
+ }
+ else if(lstrcmp(name,"_allshl")==0){
+ //符号あり左ビットシフト用の特殊関数(64ビット整数対応)
+ BYTE Buffer_allshl[]={
+ 0x80,0xF9,0x40,0x73,0x15,0x80,0xF9,0x20,0x73,0x06,0x0F,0xA5,0xC2,0xD3,0xE0,0xC3,0x8B,0xD0,0x33,0xC0,0x80,0xE1,0x1F,0xD3,0xE2,0xC3,0x33,0xC0,0x33,0xD2,0xC3
+ };
+
+ memcpy(OpBuffer+obp,Buffer_allshl,31);
+ obp+=31;
+ }
+ else if(lstrcmp(name,"_allshr")==0){
+ //符号あり右ビットシフト用の特殊関数(64ビット整数対応)
+ BYTE Buffer_allshr[]={
+ 0x80,0xF9,0x40,0x73,0x16,0x80,0xF9,0x20,0x73,0x06,0x0F,0xAD,0xD0,0xD3,0xFA,0xC3,0x8B,0xC2,0xC1,0xFA,0x1F,0x80,0xE1,0x1F,0xD3,0xF8,0xC3,0xC1,0xFA,0x1F,0x8B,0xC2,0xC3
+ };
+
+ memcpy(OpBuffer+obp,Buffer_allshr,33);
+ obp+=33;
+ }
+ else if(lstrcmp(name,"_aullshr")==0){
+ //符号なし右ビットシフト用の特殊関数(64ビット整数対応)
+ BYTE Buffer_aullshr[]={
+ 0x80,0xF9,0x40, //cmp cl,40h
+ 0x73,0x15, //jae RETZERO (0040d71a)
+ 0x80,0xF9,0x20, //cmp cl,20h
+ 0x73,0x06, //jae MORE32 (0040d710)
+ 0x0F,0xAD,0xD0, //shrd eax,edx,cl
+ 0xD3,0xEA, //shr edx,cl
+ 0xC3, //ret
+ //MORE32:
+ 0x8B,0xC2, //mov eax,edx
+ 0x33,0xD2, //xor edx,edx
+ 0x80,0xE1,0x1F, //and cl,1Fh
+ 0xD3,0xE8, //shr eax,cl
+ 0xC3, //ret
+ //RETZERO:
+ 0x33,0xC0, //xor eax,eax
+ 0x33,0xD2, //xor edx,edx
+ 0xC3 //ret
+ };
+
+ memcpy(OpBuffer+obp,Buffer_aullshr,31);
+ obp+=31;
+ }
+}
+void CompileBufferInProcedure(SUBINFO *psi){
+ extern char *basbuf;
+ extern HANDLE hHeap;
+ extern SUBINFO **ppSubHash;
+ extern BOOL bDebugCompile;
+ int i3,i4,i5,VarSize,BufferSize;
+ char temporary[VN_SIZE];
+
+ BufferSize=128;
+
+ if(psi->bUse==0||psi->bCompile) return;
+
+
+ psi->bCompile=1;
+
+ extern BOOL bSystemProc;
+ if(memcmp(psi->name,"_System_",8)==0) bSystemProc=1;
+ else bSystemProc=0;
+
+ extern BOOL bDebugSupportProc;
+ if(memcmp(psi->name,"_DebugSys_",10)==0){
+ if(!bDebugCompile){
+ psi->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
+ psi->VarNum=0;
+ return;
+ }
+ bDebugSupportProc=1;
+ }
+ else bDebugSupportProc=0;
+
+ psi->CompileAddress=obp;
+
+ if(psi->bSystem){
+ ////////////////////
+ // 特殊関数
+ ////////////////////
+
+ extern int MaxLocalVarNum;
+ extern int AllLocalVarSize;
+ MaxLocalVarNum=0;
+ AllLocalVarSize=0;
+
+ //スタックフレーム管理用オブジェクトを初期化
+ extern CStackFrame *pobj_sf;
+ pobj_sf=new CStackFrame();
+
+ SystemProc(psi->name);
+
+ //スタックフレーム管理用オブジェクトを破棄
+ delete pobj_sf;
+ pobj_sf=0;
+
+ psi->EndOpAddr=obp;
+ psi->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
+ psi->VarNum=0;
+ return;
+ }
+
+ cp=psi->address;
+ for(;;cp++){
+ if(IsCommandDelimitation(basbuf[cp])) break;
+ }
+ cp--;
+
+ //プロシージャ抜け出しスケジュール(Exit Sub/Function)
+ extern DWORD *pExitSubSchedule;
+ extern int ExitSubScheduleNum;
+ pExitSubSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
+ ExitSubScheduleNum=0;
+
+ //ラベル用のメモリを確保
+ extern LABEL *pLabelNames;
+ extern int MaxLabelNum;
+ pLabelNames=(LABEL *)HeapAlloc(hHeap,0,1);
+ MaxLabelNum=0;
+
+ //Gotoラベルスケジュール
+ extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
+ extern int GotoLabelScheduleNum;
+ pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapAlloc(hHeap,0,1);
+ GotoLabelScheduleNum=0;
+
+ //With情報のメモリを確保
+ extern WITHINFO WithInfo;
+ WithInfo.ppName=(char **)HeapAlloc(hHeap,0,1);
+ WithInfo.pWithCp=(int *)HeapAlloc(hHeap,0,1);
+ WithInfo.num=0;
+
+ //重複エラー情報管理のメモリを確保
+ extern char **SynonymErrorWords;
+ extern int SynonymErrorNum;
+ SynonymErrorNum=0;
+ SynonymErrorWords=(char **)HeapAlloc(hHeap,0,1);
+
+ //Continueアドレスを初期化
+ extern DWORD dwContinueAddress;
+ dwContinueAddress=-1;
+
+ //ローカル変数に関する情報
+ extern VARIABLE *LocalVar;
+ extern int MaxLocalVarNum;
+ extern int AllLocalVarSize;
+ LocalVar=(VARIABLE *)HeapAlloc(hHeap,0,sizeof(VARIABLE));
+ MaxLocalVarNum=0;
+ AllLocalVarSize=0;
+
+ //ローカル変数アドレススケジュール
+ extern DWORD *pLocalVarAddrSchedule;
+ extern int LocalVarAddrScheduleNum;
+ pLocalVarAddrSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
+ LocalVarAddrScheduleNum=0;
+
+ //レキシカルスコープ情報を初期化
+ obj_LexScopes.Init(obp);
+
+
+ /////////////////////////////////////
+ // パラメータ用の変数データを考慮
+ /////////////////////////////////////
+
+ for(i3=psi->RealParmNum-1;i3>=0;i3--){
+ //変数データを追加
+ LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
+
+ lstrcpy(LocalVar[MaxLocalVarNum].name,psi->pRealParmInfo[i3].name);
+
+ LocalVar[MaxLocalVarNum].bArray=psi->pRealParmInfo[i3].bArray;
+ memcpy(LocalVar[MaxLocalVarNum].SubScripts,psi->pRealParmInfo[i3].SubScripts,MAX_ARRAYDIM*sizeof(int));
+
+ LocalVar[MaxLocalVarNum].type=psi->pRealParmInfo[i3].type;
+ if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT){
+ if(psi->bExport)
+ SetError(24,NULL,cp);
+ }
+
+ LocalVar[MaxLocalVarNum].u.index=psi->pRealParmInfo[i3].u.index;
+
+ if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_OBJECT){
+ //実態オブジェクトのByValパラメータ
+ LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER;
+ VarSize=PTR_SIZE;
+ }
+ else{
+ if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].bArray==0){
+ LocalVar[MaxLocalVarNum].fRef=0;
+ VarSize=GetTypeSize(LocalVar[MaxLocalVarNum].type,LocalVar[MaxLocalVarNum].u.index);
+ if(VarSize%PTR_SIZE) VarSize+=PTR_SIZE-(VarSize%PTR_SIZE);
+ }
+ else{
+ LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER;
+ VarSize=PTR_SIZE;
+ }
+ }
+ AllLocalVarSize+=VarSize;
+ LocalVar[MaxLocalVarNum].offset=AllLocalVarSize;
+
+ //レキシカルスコープ情報
+ LocalVar[MaxLocalVarNum].ScopeLevel=obj_LexScopes.GetNowLevel();
+ LocalVar[MaxLocalVarNum].ScopeStartAddress=obj_LexScopes.GetStartAddress();
+ LocalVar[MaxLocalVarNum].bLiving=TRUE;
+
+ MaxLocalVarNum++;
+ }
+
+ //Thisポインタを示すローカルオフセット値をセット
+ extern int LocalVar_ThisPtrOffset;
+ LocalVar_ThisPtrOffset=AllLocalVarSize;
+
+ //コンパイル中の関数が属するクラス
+ pobj_CompilingClass=psi->pobj_ParentClass;
+
+ //コンパイル中の関数
+ extern SUBINFO *pCompilingSubInfo;
+ pCompilingSubInfo=psi;
+
+ //スタックフレーム管理用クラスを初期化
+ extern CStackFrame *pobj_sf;
+ pobj_sf=new CStackFrame();
+
+
+ ///////////////////////
+ // ここからコード生成
+
+ for(i3=psi->RealParmNum-1;i3>=0;i3--){
+ if(i3==3){
+ if(IsRealNumberType(psi->pRealParmInfo[i3].type)&&psi->pRealParmInfo[i3].bByVal){
+ //movsd qword ptr[rsp+0x20],xmm3
+ op_movsd_MR(REG_XMM3,REG_RSP,0x20,MOD_BASE_DISP32);
+ }
+ else{
+ //mov qword ptr[rsp+0x20],r9
+ op_mov_MR(sizeof(_int64),REG_R9,REG_RSP,0x20,MOD_BASE_DISP32);
+ }
+ }
+ if(i3==2){
+ if(IsRealNumberType(psi->pRealParmInfo[i3].type)&&psi->pRealParmInfo[i3].bByVal){
+ //movsd qword ptr[rsp+0x18],xmm2
+ op_movsd_MR(REG_XMM2,REG_RSP,0x18,MOD_BASE_DISP32);
+ }
+ else{
+ //mov qword ptr[rsp+0x18],r8
+ op_mov_MR(sizeof(_int64),REG_R8,REG_RSP,0x18,MOD_BASE_DISP32);
+ }
+ }
+ if(i3==1){
+ if(IsRealNumberType(psi->pRealParmInfo[i3].type)&&psi->pRealParmInfo[i3].bByVal){
+ //movsd qword ptr[rsp+0x10],xmm1
+ op_movsd_MR(REG_XMM1,REG_RSP,0x10,MOD_BASE_DISP32);
+ }
+ else{
+ //mov qword ptr[rsp+0x10],rdx
+ op_mov_MR(sizeof(_int64),REG_RDX,REG_RSP,0x10,MOD_BASE_DISP32);
+ }
+ }
+ if(i3==0){
+ if(IsRealNumberType(psi->pRealParmInfo[i3].type)&&psi->pRealParmInfo[i3].bByVal){
+ //movsd qword ptr[rsp+0x8],xmm0
+ op_movsd_MR(REG_XMM0,REG_RSP,0x8,MOD_BASE_DISP32);
+ }
+ else{
+ //mov qword ptr[rsp+0x8],rcx
+ op_mov_MR(sizeof(_int64),REG_RCX,REG_RSP,0x8,MOD_BASE_DISP32);
+ }
+ }
+ }
+
+ //ret用のアドレスを考慮
+ AllLocalVarSize+=sizeof(_int64);
+
+ //sub rsp,スタックフレームサイズ
+ int StackFrameSchedule;
+ op_sub_rsp(0xFFFFFFFF);
+ StackFrameSchedule=obp-sizeof(long);
+
+ //mov qword ptr[rsp+offset],reg ※スタックフレームを利用
+ pobj_sf->push(REG_RBX);
+ pobj_sf->push(REG_RSI);
+ pobj_sf->push(REG_RDI);
+ pobj_sf->push(REG_R12);
+ pobj_sf->push(REG_R13);
+ pobj_sf->push(REG_R14);
+ pobj_sf->push(REG_R15);
+
+ //ローカル変数のベース値
+ int BaseLocalVar;
+ BaseLocalVar=AllLocalVarSize;
+
+ if(psi->ReturnType!=-1){
+ //戻り値が存在するとき
+
+ char *temp;
+ if(psi->name[0]==1&&psi->name[1]==ESC_OPERATOR) temp="_System_ReturnValue";
+ else temp=psi->name;
+
+ if(psi->ReturnType==DEF_OBJECT){
+ //戻り値用オブジェクトのコンストラクタを呼び出す
+ if(psi->u.Return_pobj_c->ConstructorMemberSubIndex!=-1){
+ sprintf(temporary,"%s.%s()",temp,psi->u.Return_pobj_c->name);
+ OpcodeOthers(temporary);
+ }
+ }
+ else{
+ //戻り値用の変数の定義
+ sprintf(temporary,"%s%c%c",temp,1,ESC_AS);
+ GetTypeName(psi->ReturnType,psi->u.ReturnIndex,temporary+lstrlen(temporary));
+ OpcodeDim(temporary,0);
+ }
+ }
+
+ int RspOffsetSchedule=0;
+ int RspOffsetSchedule2;
+ if(bDebugCompile&&bDebugSupportProc==0){
+ //mov rdx, qword ptr[rsp+スタックフレームサイズ]
+ op_mov_RM(sizeof(_int64),REG_RDX,REG_RSP,0,MOD_BASE_DISP32);
+ RspOffsetSchedule=obp-sizeof(long);
+
+ //mov rcx,rsp
+ op_mov64_ToReg_FromReg(REG_RCX,REG_RSP);
+
+ //add rcx,スタックフレームサイズ+sizeof(_int64) ※ret用のサイズを考慮
+ op_add64_value(REG_RCX,0);
+ RspOffsetSchedule2=obp-sizeof(long);
+
+ //call _DebugSys_StartProc
+ extern SUBINFO *pSub_DebugSys_StartProc;
+ op_call(pSub_DebugSys_StartProc);
+ }
+
+ if(pobj_CompilingClass){
+ if(lstrcmp(psi->name,pobj_CompilingClass->name)==0){
+ ////////////////////////////////////
+ // コンストラクタをコンパイルするとき
+ ////////////////////////////////////
+
+ //スーパークラスかどうかの識別
+ //(継承元がインターフェイスの場合もスーパークラスと見なす)
+ BOOL bThisIsSuperClass;
+ if(pobj_CompilingClass->pobj_InheritsClass==0) bThisIsSuperClass=1;
+ else if(pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex==-1){
+ //インターフェイスを継承したときはコンストラクタを持たない
+ bThisIsSuperClass=1;
+ }
+ else bThisIsSuperClass=0;
+
+ if(!bThisIsSuperClass){
+ /* サブクラスコンストラクタをコンパイルしているときは、
+ スーパークラスのコンストラクタを呼び出す */
+
+ i3=cp+1;
+ while(IsCommandDelimitation(basbuf[i3])) i3++;
+ for(i4=0;;i3++,i4++){
+ if(!IsVariableChar(basbuf[i3])){
+ temporary[i4]=0;
+ break;
+ }
+ temporary[i4]=basbuf[i3];
+ }
+ if(lstrcmp(temporary,
+ pobj_CompilingClass->pobj_InheritsClass->name)==0){
+ //スーパークラスのコンストラクタを呼び出す
+ cp=i3;
+ for(i4=0;;cp++,i4++){
+ if(IsCommandDelimitation(basbuf[cp])){
+ temporary[i4]=0;
+ break;
+ }
+ temporary[i4]=basbuf[cp];
+ }
+ if(!(temporary[0]=='('&&temporary[lstrlen(temporary)-1]==')')){
+ SetError(1,NULL,cp);
+ }
+ RemoveStringPare(temporary);
+
+ i3=pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex;
+ Opcode_CallProc(temporary,
+ pobj_CompilingClass->ppobj_Method[i3]->psi,
+ 0,
+ 0,
+ "",
+ 0);
+ }
+ else{
+ //スーパークラスのコンストラクタを暗黙的に呼び出す
+ i3=pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex;
+ Opcode_CallProc("",
+ pobj_CompilingClass->ppobj_Method[i3]->psi,
+ 0,
+ 0,
+ "",
+ 0);
+ }
+ }
+
+ //実体クラスを持つメンバのコンストラクタ(引数有りを除く)を呼び出す
+ int offset;
+ int MemberTypeSize;
+ int MemberObjectNum;
+ if(pobj_CompilingClass->vtbl_num) offset=PTR_SIZE;
+ else offset=0;
+ for(i3=0;i3iMemberNum;i3++){
+ MemberTypeSize=
+ GetTypeSize(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type,
+ pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.lpIndex);
+
+ MemberObjectNum=
+ JumpSubScripts(pobj_CompilingClass->ppobj_Member[i3]->SubScripts);
+
+ offset=GetSizeOfClassMember(pobj_CompilingClass,pobj_CompilingClass->ppobj_Member[i3]->name,NULL);
+
+ if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type==DEF_OBJECT){
+ if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex!=-1){
+ i5=pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex;
+ if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi->RealParmNum==1){ //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる
+ for(i4=0;i4ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
+ }
+ }
+ }
+ }
+ }
+
+ //仮想関数テーブルを初期化
+ if(pobj_CompilingClass->vtbl_num&&
+ pobj_CompilingClass->IsHoldAbstractFunction()==0){
+ //関数テーブルに値をセット
+ offset=(int)pobj_CompilingClass->GetVtblGlobalOffset();
+
+ //mov rax,offset
+ op_mov_RV(sizeof(_int64),REG_RAX,offset);
+ obp-=sizeof(long);
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+
+ //Thisポインタをrcxにコピー
+ SetThisPtrToReg(REG_RCX);
+
+ //mov qword ptr[rcx],rax
+ op_mov_MR(sizeof(_int64),REG_RAX,REG_RCX,0,MOD_BASE);
+ }
+ }
+ }
+
+ //コード生成中に関数の先頭領域にDimステートメントを再配置できるようにする
+ extern int DimStatementInsertPoint;
+ DimStatementInsertPoint=obp;
+
+ //////////////////////////////////////////
+ //////////////////////////////////////////
+ ////// プロシージャ内をコンパイル ////////
+ if(psi->dwType==SUBTYPE_SUB) CompileBuffer(ESC_ENDSUB,0);
+ else if(psi->dwType==SUBTYPE_FUNCTION) CompileBuffer(ESC_ENDFUNCTION,0);
+ else if(psi->dwType==SUBTYPE_MACRO) CompileBuffer(ESC_ENDMACRO,0);
+ //////////////////////////////////////////
+ //////////////////////////////////////////
+
+ if(pobj_CompilingClass){
+ if(psi->name[0]=='~'){
+ ////////////////////////////////////
+ //デストラクタをコンパイルしたとき
+ ////////////////////////////////////
+
+ if(pobj_CompilingClass->pobj_InheritsClass){
+ /* サブクラスのデストラクタをコンパイルしているときは、
+ スーパークラスのデストラクタを呼び出す */
+
+ i3=pobj_CompilingClass->pobj_InheritsClass->DestructorMemberSubIndex;
+ if(i3!=-1){
+ Opcode_CallProc("",
+ pobj_CompilingClass->ppobj_Method[i3]->psi,
+ 0,
+ 0,
+ "",
+ 0);
+ }
+ }
+
+ //実体クラスを持つメンバのデストラクタを呼び出す
+ //※コンストラクタと逆順序で呼び出す
+ int offset;
+ int MemberTypeSize;
+ int MemberObjectNum;
+ for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){
+ MemberTypeSize=
+ GetTypeSize(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type,
+ pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.lpIndex);
+
+ MemberObjectNum=
+ JumpSubScripts(pobj_CompilingClass->ppobj_Member[i3]->SubScripts);
+
+ offset=GetSizeOfClassMember(pobj_CompilingClass,pobj_CompilingClass->ppobj_Member[i3]->name,NULL);
+
+ if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type==DEF_OBJECT){
+ if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->DestructorMemberSubIndex!=-1){
+ for(i4=MemberObjectNum-1;i4>=0;i4--){
+ //Thisポインタをrcxにコピー
+ SetThisPtrToReg(REG_RCX);
+
+ //add rcx,offset
+ op_add64_value(REG_RCX,offset+i4*MemberTypeSize);
+
+ //call destructor
+ i5=pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->DestructorMemberSubIndex;
+ op_call(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //プロシージャ抜け出しスケジュール(Exit Sub/Function)
+ for(i3=0;i3ReturnType!=-1){
+ //////////////////////////////////
+ // 戻り値をraxまたはxmm0に設定
+ //////////////////////////////////
+
+ RELATIVE_VAR RelativeVar;
+ LONG_PTR lpIndex;
+
+ char *temp;
+ if(psi->name[0]==1&&psi->name[1]==ESC_OPERATOR)
+ temp="_System_ReturnValue";
+ else temp=psi->name;
+ GetVarOffset(1,temp,&i3,&RelativeVar,&lpIndex);
+
+ i3=psi->ReturnType;
+
+ if(i3==DEF_OBJECT){
+ SetVarPtrToReg(REG_RAX,&RelativeVar);
+ }
+ else if(i3==DEF_DOUBLE){
+ //64ビット実数型
+ SetXmmReg_DoubleVariable(&RelativeVar,REG_XMM0);
+ }
+ else if(i3==DEF_SINGLE){
+ //32ビット実数型
+ SetXmmReg_SingleVariable(&RelativeVar,REG_XMM0);
+ }
+ else if(IsWholeNumberType(i3)){
+ //整数型
+ SetReg_WholeVariable(i3,&RelativeVar,REG_RAX);
+ }
+ else SetError(300,NULL,cp);
+ }
+
+ //ローカル変数領域のサイズをスタックフレームに通知
+ int iLocalParmSize;
+ iLocalParmSize=AllLocalVarSize-BaseLocalVar;
+ pobj_sf->SetLocalParmSize(iLocalParmSize);
+
+ //ローカル変数アドレススケジュール
+ for(i3=0;i3GetFrameSize();
+ }
+ HeapDefaultFree(pLocalVarAddrSchedule);
+ for(i3=0;i3GetFrameSize()-LocalVar[i3].offset;
+ }
+
+ //mov reg,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R15);
+ pobj_sf->pop(REG_R14);
+ pobj_sf->pop(REG_R13);
+ pobj_sf->pop(REG_R12);
+ pobj_sf->pop(REG_RDI);
+ pobj_sf->pop(REG_RSI);
+ pobj_sf->pop(REG_RBX);
+
+ int iStackFrameSize;
+ iStackFrameSize=iLocalParmSize + pobj_sf->GetFrameSize();
+
+ //add rsp,スタックフレームサイズ
+ op_add_rsp(iStackFrameSize);
+
+ //ret 0
+ OpBuffer[obp++]=(char)0xC3;
+
+
+ //デバッグ用
+ if(RspOffsetSchedule){
+ *((long *)(OpBuffer+RspOffsetSchedule))=iStackFrameSize;
+ *((long *)(OpBuffer+RspOffsetSchedule2))=iStackFrameSize+sizeof(_int64);
+ }
+
+
+ //スタックフレームスケジュール(subコマンド)
+ *((long *)(OpBuffer+StackFrameSchedule))=iStackFrameSize;
+
+ //スタックフレームスケジュールを実行
+ pobj_sf->RunningSchedule();
+ delete pobj_sf;
+ pobj_sf=0;
+
+
+ psi->EndOpAddr=obp;
+ psi->pVar=LocalVar;
+ psi->VarNum=MaxLocalVarNum;
+
+ //ローカル変数のネーム情報は後に解放する
+}
+void CompileLocal(){
+ extern SUBINFO **ppSubHash;
+ int i2;
+ SUBINFO *psi;
+
+ extern BOOL bDll;
+ if(bDll){
+ //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする
+ psi=GetSubHash("_System_InitDllGlobalVariables");
+ if(psi){
+ CompileBufferInProcedure(psi);
+ }
+ else SetError(300,NULL,cp);
+ }
+
+ //_System_InitStaticLocalVariablesは一番最後にコンパイル
+ //※一般関数内の静的変数オブジェクトをすべて収集しなければならない
+ extern SUBINFO *pSub_System_InitStaticLocalVariables;
+ pSub_System_InitStaticLocalVariables->bCompile=1;
+
+ //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
+ extern SUBINFO *pSub_System_Call_Destructor_of_GlobalObject;
+ pSub_System_Call_Destructor_of_GlobalObject->bCompile=1;
+
+Repeat:
+ for(i2=0;i2pNextData;
+ }
+ }
+
+ //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
+ for(i2=0;i2bUse&&psi->bCompile==0&&psi->bVirtual==0){
+ goto Repeat;
+ }
+
+ psi=psi->pNextData;
+ }
+ }
+
+ //_System_InitStaticLocalVariablesは一番最後にコンパイル
+ pSub_System_InitStaticLocalVariables->bCompile=0;
+ CompileBufferInProcedure(pSub_System_InitStaticLocalVariables);
+
+ //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
+ pSub_System_Call_Destructor_of_GlobalObject->bCompile=0;
+ CompileBufferInProcedure(pSub_System_Call_Destructor_of_GlobalObject);
+}
Index: /BasicCompiler64/Compile_Set_Var.cpp
===================================================================
--- /BasicCompiler64/Compile_Set_Var.cpp (revision 3)
+++ /BasicCompiler64/Compile_Set_Var.cpp (revision 3)
@@ -0,0 +1,386 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+BOOL IsUse_r11(RELATIVE_VAR *pRelativeVar){
+ if(pRelativeVar->bOffsetOffset||pRelativeVar->dwKind==VAR_DIRECTMEM) return 1;
+ return 0;
+}
+
+void SetObjectVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap){
+ int RightTermReg;
+ pobj_reg=new CRegister(REG_RCX);
+
+ //VarRegにオブジェクトポインタをコピー
+ int VarReg;
+ VarReg=pobj_reg->LockReg();
+ SetVarPtrToReg(VarReg,pRelativeVar);
+
+ //右辺
+ if(IsRealNumberType(CalcType)){
+ RightTermReg=pobj_reg->LockXmmReg();
+
+ if(CalcType==DEF_DOUBLE){
+ //movlsd RightTermReg,xmm0
+ op_movsd_RR(RightTermReg,REG_XMM0);
+ }
+ else if(CalcType==DEF_SINGLE){
+ //movlss RightTermReg,xmm0
+ op_movss_RR(RightTermReg,REG_XMM0);
+ }
+ }
+ else{
+ RightTermReg=pobj_reg->LockReg();
+
+ //mov RightTermReg,rax
+ op_mov_RR(RightTermReg,REG_RAX);
+ }
+
+
+ ///////////////////////////////////////////////////////////////////
+ // オペレータ '=' のオーバーロード関数を呼ぶ
+ ///////////////////////////////////////////////////////////////////
+
+ int type[10];
+ LONG_PTR index_stack[10];
+ BOOL array_bUseHeap[10];
+ int sp=2;
+
+ //左辺
+ type[0]=DEF_OBJECT;
+ index_stack[0]=lpVarIndex;
+ array_bUseHeap[0]=0;
+
+ //右辺
+ type[1]=CalcType;
+ index_stack[1]=lpCalcIndex;
+ array_bUseHeap[1]=bUseHeap;
+
+
+ int iRet;
+ iRet=CallOperatorProc(CALC_SUBSITUATION,NULL,type,index_stack,array_bUseHeap,sp);
+
+ //右辺用レジスタを解除
+ if(IsRealNumberType(CalcType)) pobj_reg->UnlockXmmReg();
+ else pobj_reg->UnlockReg();
+
+ //左辺用レジスタを解除
+ pobj_reg->UnlockReg();
+
+ //レジスタ管理オブジェクトを破棄
+ delete pobj_reg;
+ pobj_reg=0;
+
+ if(iRet==-1||iRet==1){
+ //成功したとき、またはエラーが発行されたとき
+ return;
+ }
+
+
+
+ if(CalcType==DEF_OBJECT&&lpVarIndex==lpCalcIndex){
+ //双方のオブジェクト型が完全に一致したとき
+ //※コピーを行う
+
+ //mov rsi,RightTermReg
+ op_mov_RR(REG_RSI,RightTermReg);
+
+ //mov rdi,VarReg
+ op_mov_RR(REG_RDI,VarReg);
+
+ int object_size;
+ object_size=GetSizeOfClass((CClass *)lpVarIndex);
+
+ //mov rcx,object_size
+ op_mov_RV(sizeof(_int64),REG_RCX,object_size);
+
+ if(bUseHeap){
+ //mov rax,rsi
+ op_mov_RR(REG_RAX,REG_RSI);
+ }
+
+ //rep movs byte ptr[rdi],byte ptr[rsi]
+ op_rep_movs(sizeof(BYTE));
+
+ if(bUseHeap){
+ //mov rcx,rax
+ op_mov_RR(REG_RCX,REG_RAX);
+
+ //call free
+ extern SUBINFO *pSub_free;
+ op_call(pSub_free);
+ }
+
+ return;
+ }
+ else{
+ SetError(1,NULL,cp);
+ }
+}
+
+void SetDoubleVariable(int type,RELATIVE_VAR *pRelative){
+ //////////////////////////
+ // Double型変数に書き込む
+ //////////////////////////
+
+ //xmm0に型変換
+ ChangeTypeToXmm_Double(type,REG_XMM0,REG_RAX);
+
+ if(pRelative->dwKind==VAR_GLOBAL){
+ if(pRelative->bOffsetOffset){
+ //movsd qword ptr[r11+offset],xmm0
+ OpBuffer[obp++]=(char)0xF2;
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x11;
+ OpBuffer[obp++]=(char)0x83;
+ *((long *)(OpBuffer+obp))=(int)pRelative->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //movsd qword ptr[offset],xmm0
+ OpBuffer[obp++]=(char)0xF2;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x11;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=(int)pRelative->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelative->dwKind==VAR_LOCAL){
+ if(pRelative->bOffsetOffset){
+ //movsd qword ptr[rsp+r11+offset],xmm0
+ OpBuffer[obp++]=(char)0xF2;
+ OpBuffer[obp++]=(char)0x42;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x11;
+ OpBuffer[obp++]=(char)0x84;
+ OpBuffer[obp++]=(char)0x1C;
+ *((long *)(OpBuffer+obp))=(int)pRelative->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //movsd qword ptr[rsp+offset],xmm0
+ OpBuffer[obp++]=(char)0xF2;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x11;
+ OpBuffer[obp++]=(char)0x84;
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=(int)pRelative->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelative->dwKind==VAR_REFLOCAL){
+ if(pRelative->bOffsetOffset){
+ //add r11,qword ptr[rsp+offset]
+ OpBuffer[obp++]=(char)0x4C;
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0x9C;
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=(int)pRelative->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov r11,qword ptr[rsp+offset]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ goto directmem;
+ }
+ else if(pRelative->dwKind==VAR_DIRECTMEM){
+directmem:
+ //movsd qword ptr[r11],xmm0
+ OpBuffer[obp++]=(char)0xF2;
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x11;
+ OpBuffer[obp++]=(char)0x03;
+ }
+}
+void SetSingleVariable(int type,RELATIVE_VAR *pRelative){
+ //////////////////////////
+ // Single型変数に書き込む
+ //////////////////////////
+
+ //xmm0に型変換
+ ChangeTypeToXmm_Single(type,REG_XMM0,REG_RAX);
+
+ if(pRelative->dwKind==VAR_GLOBAL){
+ if(pRelative->bOffsetOffset){
+ //movss dword ptr[r11+offset],xmm0
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x11;
+ OpBuffer[obp++]=(char)0x83;
+ *((long *)(OpBuffer+obp))=(int)pRelative->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //movss dword ptr[offset],xmm0
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x11;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=(int)pRelative->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelative->dwKind==VAR_LOCAL){
+ if(pRelative->bOffsetOffset){
+ //movss dword ptr[rsp+r11+offset],xmm0
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x42;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x11;
+ OpBuffer[obp++]=(char)0x84;
+ OpBuffer[obp++]=(char)0x1C;
+ *((long *)(OpBuffer+obp))=(int)pRelative->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //movss dword ptr[rsp+offset],xmm0
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x11;
+ OpBuffer[obp++]=(char)0x84;
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=(int)pRelative->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelative->dwKind==VAR_REFLOCAL){
+ if(pRelative->bOffsetOffset){
+ //add r11,qword ptr[rsp+offset]
+ OpBuffer[obp++]=(char)0x4C;
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0x9C;
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=(int)pRelative->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov r11,qword ptr[rsp+offset]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ goto directmem;
+ }
+ else if(pRelative->dwKind==VAR_DIRECTMEM){
+directmem:
+ //movss dword ptr[r11],xmm0
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x11;
+ OpBuffer[obp++]=(char)0x03;
+ }
+}
+void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative){
+ if(type==DEF_DOUBLE){
+ //Double型
+
+ //cvttsd2si rax,xmm0
+ op_cvttsd2si_xmm(sizeof(_int64),REG_RAX,REG_XMM0);
+ }
+ else if(type==DEF_SINGLE){
+ //Single型
+
+ //cvttss2si rax,xmm0
+ op_cvttss2si_xmm(sizeof(_int64),REG_RAX,REG_XMM0);
+ }
+ else{
+ //その他の整数
+
+ if(var_size==sizeof(_int64)){
+ //レジスタの値を64ビット(rax)に拡張する
+ ExtendTypeTo64(type,REG_RAX);
+ }
+ else if(var_size==sizeof(long)){
+ //レジスタの値を32ビット(eax)に拡張する
+ ExtendTypeTo32(type,REG_RAX);
+ }
+ else if(var_size==sizeof(short)){
+ //レジスタの値を16ビット(ax)に拡張する
+ ExtendTypeTo16(type,REG_RAX);
+ }
+ //8ビットは拡張なし
+ }
+
+ if(pRelative->dwKind==VAR_GLOBAL){
+ if(pRelative->bOffsetOffset){
+ //mov ptr[r11+offset],rax/eax/ax/al
+ op_mov_MR(var_size,REG_RAX,REG_R11,(int)pRelative->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ptr[offset],rax/eax/ax/al
+ op_mov_MR(var_size,REG_RAX,0,(int)pRelative->offset,MOD_DISP32);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelative->dwKind==VAR_LOCAL){
+ if(pRelative->bOffsetOffset){
+ //mov ptr[rsp+r11+offset],rax/eax/ax/al
+ op_mov_MR_ex(var_size,REG_RAX,REG_RSP,REG_R11,(int)pRelative->offset,USE_OFFSET);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov ptr[rsp+offset],rax/eax/ax/al
+ op_mov_MR(var_size,REG_RAX,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelative->dwKind==VAR_REFLOCAL){
+ if(pRelative->bOffsetOffset){
+ //add r11,qword ptr[rsp+offset]
+ OpBuffer[obp++]=(char)0x4C;
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0x9C;
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=(int)pRelative->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov r11,qword ptr[rsp+offset]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ goto directmem;
+ }
+ else if(pRelative->dwKind==VAR_DIRECTMEM){
+directmem:
+
+ //mov ptr[r11],rax/eax/ax/al
+ op_mov_MR(var_size,REG_RAX,REG_R11,0,MOD_BASE);
+ }
+}
Index: /BasicCompiler64/Compile_Statement.cpp
===================================================================
--- /BasicCompiler64/Compile_Statement.cpp (revision 3)
+++ /BasicCompiler64/Compile_Statement.cpp (revision 3)
@@ -0,0 +1,1487 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void OpcodeOthers(char *Command){
+ int i,i2;
+ char buffer[8192];
+ SUBINFO *psi;
+
+ for(i=0;;i++){
+ if(Command[i]=='['){
+ i2=GetStringInBracket(buffer+i,Command+i);
+ i+=i2-1;
+ continue;
+ }
+ if(Command[i]==1&&Command[i+1]==ESC_PSMEM){
+ buffer[i]=Command[i];
+ i++;
+ buffer[i]=Command[i];
+ continue;
+ }
+ if(!IsVariableChar(Command[i])){
+ buffer[i]=0;
+ break;
+ }
+ buffer[i]=Command[i];
+ }
+
+ if(!(
+ IsVariableTopChar(buffer[0])||
+ buffer[0]=='.'||
+ (buffer[0]==1&&buffer[1]==ESC_PSMEM)
+ )){
+ SetError(1,NULL,cp);
+ return;
+ }
+
+
+ if(Command[i]=='\0'){
+ //////////////////////////////
+ // パラメータ無しのマクロ検索
+ //////////////////////////////
+
+ psi=GetSubHash(Command);
+
+ //GetSubHash内でエラー提示が行われた場合
+ if(psi==(SUBINFO *)-1) return;
+
+ if(psi==0){
+ char temporary[VN_SIZE];
+ lstrcpy(temporary,Command);
+
+ CharUpper(temporary);
+ psi=GetSubHash(temporary);
+
+ //GetSubHash内でエラー提示が行われた場合
+ if(psi==(SUBINFO *)-1) return;
+ }
+
+ if(psi){
+ if(psi->dwType!=SUBTYPE_MACRO) SetError(10,Command,cp);
+
+ Opcode_CallProc("",psi,0,0,"",0);
+
+ return;
+ }
+ }
+ else if(IsNumCalcMark(Command,i)){
+ //代入演算
+ OpcodeCalc(Command);
+ return;
+ }
+
+
+ int idProc;
+ void *pInfo;
+ idProc=GetProc(buffer,&pInfo);
+
+ int i4;
+ char temp2[VN_SIZE];
+ if(idProc){
+ if(Command[i]!='('){
+ SetError(10,buffer,cp);
+ return;
+ }
+ i4=GetStringInPare_RemovePare(temp2,Command+i+1);
+
+ //閉じカッコ")"に続く文字がNULLでないときはエラーにする
+ if(Command[i+1+i4+1]!='\0') SetError(42,NULL,cp);
+
+ ////////////////
+ // 呼び出し
+ ////////////////
+
+ LONG_PTR lp;
+ i2=CallProc(idProc,pInfo,buffer,temp2,&lp);
+
+
+ /////////////////////
+ // 戻り値の処理
+ /////////////////////
+
+ if(i2==DEF_OBJECT){
+ CClass *pobj_Class;
+ pobj_Class=(CClass *)lp;
+
+ //mov r14,rax
+ op_mov_RR(REG_R14,REG_RAX);
+
+ FreeTempObject(REG_R14,pobj_Class);
+ }
+ return;
+ }
+
+
+ //////////////////////////
+ // その他は代入演算を行う
+ //////////////////////////
+ OpcodeCalc(Command);
+}
+
+void Judgment(char *buffer){
+ int reg=REG_RAX,type;
+ type=NumOpe(®,buffer,0,0,0);
+
+ int offset;
+
+ if(type==DEF_DOUBLE){
+ double dbl=0;
+ offset=AddDataTable((char *)&dbl,sizeof(double));
+
+ //comisd xmm0,qword ptr[data table offset]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x2F;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+ }
+ else if(type==DEF_SINGLE){
+ float flt=0;
+ offset=AddDataTable((char *)&flt,sizeof(float));
+
+ //comiss xmm0,dword ptr[data table offset]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x2F;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=offset;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ //整数型
+
+ //cmp rax,0
+ op_cmp_value(GetTypeSize(type,-1),REG_RAX,0);
+ }
+}
+
+void OpcodeIf(char *Parameter){
+ int i,i2,i3;
+
+ for(i=0;;i++){
+ if(Parameter[i]=='\0'){
+ SetError(21,NULL,cp);
+ return;
+ }
+ if(Parameter[i]==1&&Parameter[i+1]==ESC_THEN){
+ Parameter[i]=0;
+ break;
+ }
+ }
+
+ //条件式を実行してフラグをセット
+ Judgment(Parameter);
+
+ //je (endif、または else まで条件ジャンプ)
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x84;
+ obp+=sizeof(long);
+
+ //jeの番地
+ i3=obp;
+
+
+ /////////////////////////
+ // If内をコード化
+ /////////////////////////
+
+ //レキシカルスコープをレベルアップ
+ obj_LexScopes.LevelUp(obp);
+
+ i2=CompileBuffer(ESC_ENDIF,0);
+
+ //レキシカルスコープをレベルダウン
+ obj_LexScopes.LevelDown();
+
+
+ extern char *basbuf;
+ if(i2==ESC_ELSE){
+ //jmp (endifまで)
+ OpBuffer[obp++]=(char)0xE9;
+ obp+=sizeof(long);
+
+ *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3; //ifからelseへのジャンプ先のオフセット値
+
+ i3=obp;
+
+
+ /////////////////////////
+ // Else内をコード化
+ /////////////////////////
+
+ //レキシカルスコープをレベルアップ
+ obj_LexScopes.LevelUp(obp);
+
+ CompileBuffer(ESC_ENDIF,0);
+
+ //レキシカルスコープをレベルダウン
+ obj_LexScopes.LevelDown();
+
+
+ *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3; //jmpジャンプ先のオフセット値
+ }
+ else{
+ *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3; //jeジャンプ先のオフセット値
+ }
+}
+
+int GetLabelAddress(char *LabelName,int LineNum){
+ extern int MaxLabelNum;
+ extern LABEL *pLabelNames;
+ int i;
+
+ if(LabelName){
+ for(i=0;ilock((int *)&dwTempContinue);
+ pobj_TempSchedule->lock((int *)&dwContinueAddress);
+
+ if(!Parameter[0]) SetError(10,"While",cp);
+
+ //条件式を実行してフラグをセット
+ Judgment(Parameter);
+
+ //je (Wend まで)
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x84;
+ obp+=sizeof(long);
+
+ //実行中の番地
+ int je_schedule=obp;
+ pobj_TempSchedule->lock(&je_schedule);
+
+ //ExitWhileスケジュールの準備
+ lpdwTemp=pExitWhileSchedule;
+ TempNum=ExitWhileScheduleNum;
+ pExitWhileSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
+ ExitWhileScheduleNum=0;
+
+ //レキシカルスコープをレベルアップ
+ obj_LexScopes.LevelUp(obp);
+
+ //While内をコンパイル
+ CompileBuffer(0,COM_WEND);
+
+ CallDestrouctorsOfScope();
+
+ //jmp ...
+ OpBuffer[obp++]=(char)0xE9;
+ *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
+ obp+=sizeof(long);
+ pobj_TempSchedule->unlock();
+ pobj_TempSchedule->unlock();
+
+ //ExitWhileスケジュール
+ for(i2=0;i2unlock();
+
+ //Continueアドレスを復元
+ dwContinueAddress=dwTempContinue;
+}
+void OpcodeExitWhile(void){
+ extern DWORD *pExitWhileSchedule;
+ extern int ExitWhileScheduleNum;
+ extern HANDLE hHeap;
+
+ if(!pExitWhileSchedule){
+ SetError(12,"Exit While",cp);
+ return;
+ }
+
+ //jmp ...(Wend addr)
+ OpBuffer[obp++]=(char)0xE9;
+
+ pExitWhileSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitWhileSchedule,(ExitWhileScheduleNum+1)*sizeof(DWORD));
+ pExitWhileSchedule[ExitWhileScheduleNum]=obp;
+ ExitWhileScheduleNum++;
+
+ obp+=sizeof(long);
+}
+char szNextVariable[VN_SIZE];
+void OpcodeFor(char *Parameter){
+ extern DWORD *pExitForSchedule;
+ extern int ExitForScheduleNum;
+ extern HANDLE hHeap;
+ DWORD *lpdwTemp;
+ int TempNum;
+ int i,i2,i3;
+ char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
+
+ //第1パラメータを取得
+ i=GetOneParameter(Parameter,0,temporary);
+ if(!Parameter[i]){
+ SetError(12,"For",cp);
+ goto ErrorStep;
+ }
+
+ for(i2=0;;i2++){
+ if(temporary[i2]=='='){
+ variable[i2]=0;
+
+ //カウンタ初期化
+ OpcodeCalc(temporary);
+ break;
+ }
+ if(temporary[i2]=='\0'){
+ SetError(12,"For",cp);
+ goto ErrorStep;
+ }
+ variable[i2]=temporary[i2];
+ }
+
+ //jmp ...
+ OpBuffer[obp++]=(char)0xE9;
+ i2=obp;
+ obp+=sizeof(long);
+
+ //Continueアドレスのバックアップとセット
+ extern DWORD dwContinueAddress;
+ DWORD dwTempContinue;
+ dwTempContinue=dwContinueAddress;
+ dwContinueAddress=obp;
+ pobj_TempSchedule->lock((int *)&dwTempContinue);
+ pobj_TempSchedule->lock((int *)&dwContinueAddress);
+
+ //第2パラメータを取得(to~)
+ i=GetOneParameter(Parameter,i,JudgeNum);
+
+ //第3パラメータを取得(step~)
+ if(Parameter[i]){
+ i=GetOneParameter(Parameter,i,StepNum);
+ if(Parameter[i]) SetError(12,"For",cp);
+ }
+ else lstrcpy(StepNum,"1");
+
+ //カウンタを増加させる
+ sprintf(temporary,"%s=(%s)+(%s)",variable,variable,StepNum);
+ OpcodeCalc(temporary);
+
+ *((long *)(OpBuffer+i2))=obp-(i2+sizeof(long));
+
+ //増加か減少かを区別する
+ sprintf(temporary,"(%s)>=0",StepNum);
+
+ int reg,type;
+ reg=REG_RAX;
+ type=NumOpe(®,temporary,0,0,0);
+
+ //cmp rax,0
+ op_cmp_value(GetTypeSize(type,-1),REG_RAX,0);
+
+ //je [カウンタ減少の場合の判定]
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x84;
+ i2=obp;
+ obp+=sizeof(long);
+
+ //判定(カウンタ増加の場合)
+ sprintf(temporary,"%s<=(%s)",variable,JudgeNum);
+
+ reg=REG_RAX;
+ type=NumOpe(®,temporary,0,0,0);
+
+ //jmp [カウンタ減少の場合の判定を飛び越す]
+ OpBuffer[obp++]=(char)0xE9;
+ i3=obp;
+ obp+=sizeof(long);
+
+ *((long *)(OpBuffer+i2))=obp-(i2+sizeof(long)); //jeジャンプ先のオフセット値
+
+ //判定(カウンタ減少の場合)
+ sprintf(temporary,"%s>=(%s)",variable,JudgeNum);
+
+ reg=REG_RAX;
+ type=NumOpe(®,temporary,0,0,0);
+
+ *((long *)(OpBuffer+i3))=obp-(i3+sizeof(long)); //jmpジャンプ先のオフセット値
+
+ //cmp rax,0
+ op_cmp_value(GetTypeSize(type,-1),REG_RAX,0);
+
+ErrorStep:
+
+ //je ...
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x84;
+ int je_schedule=obp;
+ obp+=sizeof(long);
+ pobj_TempSchedule->lock(&je_schedule);
+
+ //ExitForスケジュールの準備
+ lpdwTemp=pExitForSchedule;
+ TempNum=ExitForScheduleNum;
+ pExitForSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
+ ExitForScheduleNum=0;
+
+ //レキシカルスコープをレベルアップ
+ obj_LexScopes.LevelUp(obp);
+
+ //For内をコンパイル
+ CompileBuffer(0,COM_NEXT);
+
+ CallDestrouctorsOfScope();
+
+ if(szNextVariable[0]){
+ if(lstrcmp(szNextVariable,variable)!=0){
+ SetError(55,szNextVariable,cp);
+ }
+ }
+
+ //jmp ...
+ OpBuffer[obp++]=(char)0xE9;
+ *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
+ obp+=sizeof(long);
+ pobj_TempSchedule->unlock();
+ pobj_TempSchedule->unlock();
+
+ //ExitForスケジュール
+ for(i=0;iunlock();
+
+ //Continueアドレスを復元
+ dwContinueAddress=dwTempContinue;
+}
+void OpcodeExitFor(void){
+ extern DWORD *pExitForSchedule;
+ extern int ExitForScheduleNum;
+ extern HANDLE hHeap;
+
+ if(!pExitForSchedule){
+ SetError(12,"Exit For",cp);
+ return;
+ }
+
+ //jmp ...(Next addr)
+ OpBuffer[obp++]=(char)0xE9;
+
+ pExitForSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitForSchedule,(ExitForScheduleNum+1)*sizeof(DWORD));
+ pExitForSchedule[ExitForScheduleNum]=obp;
+ ExitForScheduleNum++;
+
+ obp+=sizeof(long);
+}
+
+void OpcodeDo(char *Parameter){
+ extern DWORD *pExitDoSchedule;
+ extern int ExitDoScheduleNum;
+ extern HANDLE hHeap;
+ int i,i2,i3;
+ DWORD *lpdwTemp;
+ int TempNum;
+
+ if(Parameter[0]) SetError(10,"Do",cp);
+
+ //ExitDoスケジュールの準備
+ lpdwTemp=pExitDoSchedule;
+ TempNum=ExitDoScheduleNum;
+ pExitDoSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
+ ExitDoScheduleNum=0;
+
+ //Continueアドレスのバックアップとセット
+ extern DWORD dwContinueAddress;
+ DWORD dwTempContinue;
+ dwTempContinue=dwContinueAddress;
+ dwContinueAddress=obp;
+ pobj_TempSchedule->lock((int *)&dwTempContinue);
+ pobj_TempSchedule->lock((int *)&dwContinueAddress);
+
+ //レキシカルスコープをレベルアップ
+ obj_LexScopes.LevelUp(obp);
+
+ //Do内をコンパイル
+ CompileBuffer(0,COM_LOOP);
+
+ CallDestrouctorsOfScope();
+
+ extern char *basbuf;
+ char temporary[VN_SIZE];
+ for(i=cp-1;;i--){
+ if(IsCommandDelimitation(basbuf[i])){
+ i+=3;
+ if(!(basbuf[i]=='0'||basbuf[i]=='1')){
+ //無条件ループ
+ break;
+ }
+ i3=i;
+
+ for(i+=2,i2=0;;i++,i2++){
+ if(IsCommandDelimitation(basbuf[i])){
+ temporary[i2]=0;
+ break;
+ }
+ temporary[i2]=basbuf[i];
+ }
+
+ //条件式を実行してフラグをセット
+ Judgment(temporary);
+
+ if(basbuf[i3]=='0'){
+ //While
+
+ //je 5(ループ終了)
+ OpBuffer[obp++]=(char)0x74;
+ OpBuffer[obp++]=(char)0x05;
+ }
+ else if(basbuf[i3]=='1'){
+ //Until
+
+ //jne 5(ループ終了)
+ OpBuffer[obp++]=(char)0x75;
+ OpBuffer[obp++]=(char)0x05;
+ }
+ break;
+ }
+ }
+
+ //jmp ...
+ OpBuffer[obp++]=(char)0xE9;
+ *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
+ obp+=sizeof(long);
+ pobj_TempSchedule->unlock();
+ pobj_TempSchedule->unlock();
+
+ //jmp ...
+ OpBuffer[obp++]=(char)0xE9;
+ int je_schedule=obp;
+ obp+=sizeof(long);
+ pobj_TempSchedule->lock(&je_schedule);
+
+ //ExitDoスケジュール
+ for(i=0;iunlock();
+
+ //Continueアドレスを復元
+ dwContinueAddress=dwTempContinue;
+}
+void OpcodeExitDo(void){
+ extern HANDLE hHeap;
+ extern DWORD *pExitDoSchedule;
+ extern int ExitDoScheduleNum;
+
+ if(!pExitDoSchedule){
+ SetError(12,"Exit Do",cp);
+ return;
+ }
+
+ //jmp ...(Loop addr)
+ OpBuffer[obp++]=(char)0xE9;
+
+ pExitDoSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitDoSchedule,(ExitDoScheduleNum+1)*sizeof(DWORD));
+ pExitDoSchedule[ExitDoScheduleNum]=obp;
+ ExitDoScheduleNum++;
+
+ obp+=sizeof(long);
+}
+void OpcodeContinue(void){
+ extern DWORD dwContinueAddress;
+
+ if(dwContinueAddress==-1){
+ SetError(12,"Continue",cp);
+ return;
+ }
+
+ //jmp ...(Continue addr)
+ OpBuffer[obp++]=(char)0xE9;
+
+ *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
+ obp+=sizeof(long);
+}
+
+void OpcodeExitSub(void){
+ extern DWORD *pExitSubSchedule;
+ extern int ExitSubScheduleNum;
+ extern HANDLE hHeap;
+
+ extern BOOL bCompilingGlobal;
+ if(bCompilingGlobal){
+ SetError(12,"Exit Sub/Function",cp);
+ return;
+ }
+
+ //jmp ...(End Sub/Function)
+ OpBuffer[obp++]=(char)0xE9;
+
+ pExitSubSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitSubSchedule,(ExitSubScheduleNum+1)*sizeof(DWORD));
+ pExitSubSchedule[ExitSubScheduleNum]=obp;
+ ExitSubScheduleNum++;
+
+ obp+=sizeof(long);
+}
+
+void AddCaseSchedule(void){
+ extern DWORD *pCaseSchedule;
+ extern int CaseScheduleNum;
+ extern HANDLE hHeap;
+
+ pCaseSchedule=(DWORD *)HeapReAlloc(hHeap,0,pCaseSchedule,(CaseScheduleNum+1)*sizeof(DWORD));
+ pCaseSchedule[CaseScheduleNum]=obp;
+ CaseScheduleNum++;
+}
+void OpcodeSelect(char *Parameter){
+ extern DWORD *pCaseSchedule;
+ extern int CaseScheduleNum;
+ extern int NowCaseSchedule;
+ extern HANDLE hHeap;
+ extern char *basbuf;
+ int i,i2,i3,NowCaseCp;
+ char temporary[VN_SIZE];
+
+ DWORD *temp_pCaseSchedule;
+ int temp_CaseScheduleNum;
+ int temp_NowCaseSchedule;
+
+ temp_pCaseSchedule=pCaseSchedule;
+ temp_CaseScheduleNum=CaseScheduleNum;
+ temp_NowCaseSchedule=NowCaseSchedule;
+ pCaseSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
+ CaseScheduleNum=0;
+ NowCaseSchedule=0;
+
+ int reg1=REG_RAX,type1;
+ LONG_PTR lpIndex;
+ type1=NumOpe(®1,Parameter,0,0,&lpIndex);
+
+ if(type1==DEF_DOUBLE){
+ //movsd qword ptr[rsp+offset],xmm_reg ※スタックフレームを利用
+ pobj_sf->push(reg1,sizeof(double));
+ }
+ else if(type1==DEF_SINGLE){
+ //movss dword ptr[rsp+offset],xmm_reg ※スタックフレームを利用
+ pobj_sf->push(reg1,sizeof(float));
+ }
+ else{
+ ExtendTypeTo64(type1,reg1);
+
+ //mov qword ptr[rsp+offset],reg ※スタックフレームを利用
+ pobj_sf->push(reg1);
+ }
+
+ for(i=cp;;i++){
+ if(basbuf[i]=='\0'){
+ HeapDefaultFree(pCaseSchedule);
+ pCaseSchedule=temp_pCaseSchedule;
+ CaseScheduleNum=temp_CaseScheduleNum;
+ NowCaseSchedule=temp_NowCaseSchedule;
+ SetError(22,"Select",cp);
+ return;
+ }
+ if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE){
+ for(i2=0;;i++){
+ if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE) i2++;
+ if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
+ i2--;
+ if(i2==0) break;
+ }
+ }
+ continue;
+ }
+ if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT) break;
+
+ if(basbuf[i]==1&&basbuf[i+1]==ESC_CASE){
+ NowCaseCp=i;
+
+ i++;
+ while(1){
+ for(i++,i2=0;;i++,i2++){
+ if(basbuf[i]=='\"'){
+ i3=GetStringInQuotation(temporary+i2,basbuf+i);
+ i+=i3-1;
+ i2+=i3-1;
+ continue;
+ }
+ if(basbuf[i]=='('){
+ i3=GetStringInPare(temporary+i2,basbuf+i);
+ i+=i3-1;
+ i2+=i3-1;
+ continue;
+ }
+ if(basbuf[i]=='['){
+ i3=GetStringInBracket(temporary+i2,basbuf+i);
+ i+=i3-1;
+ i2+=i3-1;
+ continue;
+ }
+
+ if(IsCommandDelimitation(basbuf[i])){
+ temporary[i2]=0;
+ break;
+ }
+ if(basbuf[i]==','){
+ temporary[i2]=0;
+ break;
+ }
+
+ temporary[i2]=basbuf[i];
+ }
+
+ //エラー用
+ i2=cp;
+ cp=NowCaseCp;
+
+ int reg2=REG_RDX,type2;
+ LONG_PTR lpIndex2;
+ type2=NumOpe(®2,temporary,type1,lpIndex,&lpIndex2);
+
+ cp=i2;
+
+ if(type1==DEF_OBJECT){
+ CClass *pobj_c;
+ pobj_c=(CClass *)lpIndex;
+
+ SUBINFO **ppsi;
+ int num;
+ ppsi=pobj_c->GetOperatorSubInfo(CALC_EQUAL,num);
+ if(num==0){
+ HeapDefaultFree(ppsi);
+
+ return;
+ }
+
+ PARAMETER_INFO *ppi;
+ int iParmNum=0;
+
+ //_System_LocalThis
+ ppi=(PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
+ ppi[iParmNum].bArray=0;
+ ppi[iParmNum].bByVal=0;
+ ppi[iParmNum].name=0;
+ ppi[iParmNum].type=DEF_PTR_VOID;
+ ppi[iParmNum].u.index=-1;
+ ppi[iParmNum].SubScripts[0]=-1;
+ iParmNum++;
+
+ ppi[iParmNum].bArray=0;
+ ppi[iParmNum].bByVal=0;
+ ppi[iParmNum].name=0;
+ ppi[iParmNum].type=type2;
+ ppi[iParmNum].u.index=lpIndex2;
+ ppi[iParmNum].SubScripts[0]=-1;
+ iParmNum++;
+
+ //オーバーロードを解決
+ SUBINFO *psi;
+ psi=OverloadSolution("==",ppsi,num,ppi,iParmNum,NULL);
+ HeapDefaultFree(ppsi);
+ HeapDefaultFree(ppi);
+
+ if(!psi){
+ //エラー
+ return;
+ }
+
+
+ //実体オブジェクト
+ if(reg2!=REG_RDX){
+ //mov rdx,reg2
+ op_mov_RR(REG_RDX,reg2);
+ }
+
+ //mov rcx,qword ptr[rsp+offset] ※スタックフレームから参照
+ pobj_sf->ref(REG_RCX);
+
+ //call operator_proc ※ ==演算子
+ op_call(psi);
+
+ //test rax,rax
+ op_test(REG_RAX,REG_RAX);
+
+ //jne ...
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x85;
+ }
+ else{
+ if(type1==DEF_DOUBLE){
+ int xmm_reg;
+ if(IsXmmReg(reg2)) xmm_reg=reg2;
+ else xmm_reg=REG_XMM5;
+ ChangeTypeToXmm_Double(type2,xmm_reg,reg2);
+
+ //movsd xmm4,qword ptr[rsp+offset] ※スタックフレームから参照
+ pobj_sf->ref(REG_XMM4,sizeof(double));
+
+ //comiss xmm_reg1,xmm_reg2
+ op_comisd(xmm_reg,REG_XMM4);
+ }
+ else if(type1==DEF_SINGLE){
+ int xmm_reg;
+ if(IsXmmReg(reg2)) xmm_reg=reg2;
+ else xmm_reg=REG_XMM5;
+ ChangeTypeToXmm_Single(type2,xmm_reg,reg2);
+
+ //movss xmm4,dword ptr[rsp+offset] ※スタックフレームから参照
+ pobj_sf->ref(REG_XMM4,sizeof(float));
+
+ //comiss xmm_reg1,xmm_reg2
+ op_comiss(xmm_reg,REG_XMM4);
+ }
+ else{
+ //その他整数型
+
+ i2=NeutralizationType(type1,-1,type2,-1);
+
+ //mov r14,qword ptr[rsp+offset] ※スタックフレームから参照
+ pobj_sf->ref(REG_R14);
+
+ //cmp reg2,r14
+ op_cmp_reg(GetTypeSize(i2,-1),reg2,REG_R14);
+ }
+
+ //je ...
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x84;
+ }
+ AddCaseSchedule();
+ obp+=sizeof(long);
+
+ if(basbuf[i]!=',') break;
+ }
+ }
+ if(basbuf[i]==1&&basbuf[i+1]==ESC_CASEELSE){
+ //jmp ...
+ OpBuffer[obp++]=(char)0xE9;
+ AddCaseSchedule();
+ obp+=sizeof(long);
+ }
+ }
+
+ //スタックフレームを1スペースだけ解除
+ pobj_sf->pop(REG_NON);
+
+ //レキシカルスコープをレベルアップ
+ obj_LexScopes.LevelUp(obp);
+
+ //Select Case内をコンパイル
+ CompileBuffer(ESC_ENDSELECT,0);
+
+ //jmp EndSelect
+ OpBuffer[obp++]=(char)0xE9;
+ AddCaseSchedule();
+ obp+=sizeof(long);
+
+ //最終スケジュール
+ for(i=NowCaseSchedule;ipush(REG_RAX);
+
+
+ if(Parameter[0]=='*'){
+ i=GetLabelAddress(Parameter+1,0);
+
+ //jmp ...
+ OpBuffer[obp++]=(char)0xE9;
+ if(i==-1){
+ pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
+ pGotoLabelSchedule[GotoLabelScheduleNum].pName=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter+1)+1);
+ lstrcpy(pGotoLabelSchedule[GotoLabelScheduleNum].pName,Parameter+1);
+ pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
+ pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
+ GotoLabelScheduleNum++;
+ }
+ *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
+ obp+=sizeof(long);
+ }
+ else{
+ LineNum=atoi(Parameter);
+ i=GetLabelAddress(0,LineNum);
+
+ //jmp ...
+ OpBuffer[obp++]=(char)0xE9;
+ if(i==-1){
+ pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
+ pGotoLabelSchedule[GotoLabelScheduleNum].pName=0;
+ pGotoLabelSchedule[GotoLabelScheduleNum].line=LineNum;
+ pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
+ pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
+ GotoLabelScheduleNum++;
+ }
+ *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
+ obp+=sizeof(long);
+ }
+
+ *((long *)(OpBuffer+schedule2))=obp-schedule;
+
+ //※スタックフレームを元に戻す
+ pobj_sf->pop(REG_NON);
+
+ SetError(-1,"Gosub ~ Returnステートメントは64ビットコンパイラで利用することはできません。",cp);
+}
+void OpcodeReturn(char *Parameter){
+ extern BOOL bCompilingGlobal;
+ if(bCompilingGlobal){
+ //Gosub~Returnとして扱う
+
+ //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->push(REG_NON);
+ pobj_sf->ref(REG_RAX);
+ pobj_sf->pop(REG_NON);
+
+ //jmp rax
+ OpBuffer[obp++]=(char)0xFF;
+ OpBuffer[obp++]=(char)0xE0;
+ }
+ else{
+ //戻り値をセット
+ if(Parameter[0]){
+ extern SUBINFO *pCompilingSubInfo;
+ char *temp;
+ if(pCompilingSubInfo->name[0]==1&&pCompilingSubInfo->name[1]==ESC_OPERATOR)
+ temp="_System_ReturnValue";
+ else temp=pCompilingSubInfo->name;
+
+ char temporary[VN_SIZE];
+ sprintf(temporary,"%s=%s",temp,Parameter);
+ OpcodeCalc(temporary);
+ }
+
+ //プロシージャを抜け出す(C言語のreturnと同様の処理を行う)
+ OpcodeExitSub();
+ }
+}
+
+void Opcode_Input(char *Parameter){
+ extern int cp;
+ int i2,i3,i4,i5,type;
+ BOOL bFile;
+ char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
+
+ KillStringSpaces(Parameter);
+
+ if(Parameter[0]=='#'){
+ bFile=1;
+ for(i2=0,i3=1;;i2++,i3++){
+ buffer[i2]=Parameter[i3];
+ if(Parameter[i3]==','||Parameter[i3]=='\0') break;
+ }
+ buffer[i2+1]=0;
+ i2=i3+1;
+ }
+ else{
+ bFile=0;
+ i2=0;
+ buffer[0]=0;
+
+ //表示用文字列パラメータをセット
+ if(Parameter[0]=='\"'){
+ buffer[0]='\"';
+ for(i2=1;;i2++){
+ if(Parameter[i2]=='\"'){
+ buffer[i2]=0;
+ break;
+ }
+ buffer[i2]=Parameter[i2];
+ }
+ if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
+ else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
+ else SetError(10,"Input",cp);
+ i2+=2;
+ }
+ else if((Parameter[0]=='e'||Parameter[0]=='E')&&
+ (Parameter[1]=='x'||Parameter[1]=='X')&&
+ Parameter[2]=='\"'){
+ memcpy(buffer,Parameter,3);
+ for(i2=3;;i2++){
+ if(Parameter[i2]=='\"'){
+ buffer[i2]=0;
+ break;
+ }
+ buffer[i2]=Parameter[i2];
+ }
+ if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
+ else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
+ else SetError(10,"Input",cp);
+ i2+=2;
+ }
+ else{
+ lstrcpy(buffer,"\"? \"");
+ i2=0;
+ }
+ }
+
+ //変数ポインタ、変数のタイプをセット
+ i4=0;
+ while(1){
+ for(i3=0;;i2++,i3++){
+ if(Parameter[i2]=='('){
+ i5=GetStringInPare(temporary+i3,Parameter+i2);
+ i2+=i5-1;
+ i3+=i5-1;
+ }
+ if(Parameter[i2]=='['){
+ i5=GetStringInBracket(temporary+i3,Parameter+i2);
+ i2+=i5-1;
+ i3+=i5-1;
+ }
+ if(Parameter[i2]==','){
+ temporary[i3]=0;
+ i2++;
+ break;
+ }
+ temporary[i3]=Parameter[i2];
+ if(Parameter[i2]=='\0') break;
+ }
+ if(temporary[0]=='\0'){
+ SetError(10,"Input",cp);
+ return;
+ }
+
+ LONG_PTR lpIndex;
+ RELATIVE_VAR RelativeVar;
+ GetVarOffset(1,temporary,&type,&RelativeVar,&lpIndex);
+
+ sprintf(temp2,"_System_InputDataPtr[%d]=VarPtr(%s)",i4,temporary);
+ OpcodeCalc(temp2);
+
+ if(type==DEF_LONG) type=DEF_DWORD;
+ else if(type==DEF_INTEGER) type=DEF_WORD;
+ else if(type==DEF_OBJECT){
+ CClass *pobj_Class=(CClass *)lpIndex;
+ if(lstrcmp(pobj_Class->name,"String")==0) type=DEF_STRING;
+ }
+ sprintf(temp2,"_System_InputDataType[%d]=%d",i4,type);
+ OpcodeCalc(temp2);
+
+ i4++;
+ if(Parameter[i2]=='\0') break;
+ }
+ sprintf(temp2,"_System_InputDataPtr[%d]=0",i4);
+ OpcodeCalc(temp2);
+
+ SUBINFO *psi;
+ if(bFile) psi=GetSubHash("INPUT_FromFile");
+ else psi=GetSubHash("INPUT_FromPrompt");
+ if(!psi){
+ SetError(3,"Input",cp);
+ return;
+ }
+ Opcode_CallProc(buffer,psi,0,0,"",0);
+}
+void Opcode_PrintUsing(char *Parameter,char *buffer,BOOL bFile){
+ extern int cp;
+ int i2,i3,i4,i5;
+ char temporary[VN_SIZE],temp2[8192];
+ BOOL bReturnLine;
+
+ i2=lstrlen(Parameter);
+ if(Parameter[i2-1]==';'){
+ bReturnLine=0;
+ Parameter[i2-1]=0;
+ }
+ else bReturnLine=1;
+
+ i3=lstrlen(buffer);
+ for(i2=0;;i2++,i3++){
+ if(Parameter[i2]==';'){
+ buffer[i3]=0;
+ break;
+ }
+ buffer[i3]=Parameter[i2];
+ if(Parameter[i2]=='\0') break;
+ }
+ if(Parameter[i2]==';') i2++;
+
+ if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\"");
+
+ //データポインタ、データのタイプをセット
+ i4=0;
+ while(1){
+ for(i3=0;;i2++,i3++){
+ if(Parameter[i2]=='\"'){
+ temporary[i3]=Parameter[i2];
+ for(i2++,i3++;;i2++,i3++){
+ temporary[i3]=Parameter[i2];
+ if(Parameter[i2]=='\"') break;
+ }
+ continue;
+ }
+ if(Parameter[i2]=='('){
+ i5=GetStringInPare(temporary+i3,Parameter+i2);
+ i2+=i5-1;
+ i3+=i5-1;
+ continue;
+ }
+ if(Parameter[i2]=='['){
+ i5=GetStringInBracket(temporary+i3,Parameter+i2);
+ i2+=i5-1;
+ i3+=i5-1;
+ continue;
+ }
+ if(Parameter[i2]==','){
+ temporary[i3]=0;
+ i2++;
+ break;
+ }
+ temporary[i3]=Parameter[i2];
+ if(Parameter[i2]=='\0') break;
+ }
+ if(temporary[0]=='\0'){
+ SetError(10,"Print",cp);
+ return;
+ }
+
+ int iResult;
+ iResult=IsStrCalculation(temporary);
+
+ if(iResult==1){
+ //文字列
+ sprintf(temp2,"_System_UsingStrData[%d]=%s",i4,temporary);
+ OpcodeCalc(temp2);
+
+ sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_STRING);
+ OpcodeCalc(temp2);
+ }
+ else if(iResult==0){
+ //数値
+ sprintf(temp2,"_System_UsingDblData[%d]=%s",i4,temporary);
+ OpcodeCalc(temp2);
+
+ sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_DOUBLE);
+ OpcodeCalc(temp2);
+ }
+ //else if(iResult==-1) エラー
+
+ i4++;
+ if(Parameter[i2]=='\0') break;
+ }
+ sprintf(temp2,"_System_UsingDataType[%d]=-1",i4);
+ OpcodeCalc(temp2);
+
+ SUBINFO *psi;
+ if(bFile) psi=GetSubHash("PRINTUSING_ToFile");
+ else psi=GetSubHash("PRINTUSING_ToPrompt");
+ if(!psi){
+ SetError(3,"Print",cp);
+ return;
+ }
+ Opcode_CallProc(buffer,psi,0,0,"",0);
+}
+void Opcode_Print(char *Parameter,BOOL bWrite){
+ int i2,i3,i4,sw;
+ char temporary[VN_SIZE],buffer[VN_SIZE];
+ BOOL bFile;
+
+ KillStringSpaces(Parameter);
+
+ if(Parameter[0]=='#'){
+ bFile=1;
+ for(i2=0,i3=1;;i2++,i3++){
+ buffer[i2]=Parameter[i3];
+ if(Parameter[i3]==','||Parameter[i3]=='\0') break;
+ }
+ buffer[i2+1]=0;
+ if(Parameter[i3]==',') i3++;
+ i2=i3;
+ }
+ else{
+ bFile=0;
+ i2=0;
+ buffer[0]=0;
+ }
+ if(Parameter[i2]==1&&Parameter[i2+1]==ESC_USING){
+ Opcode_PrintUsing(Parameter+i2+2,buffer,bFile);
+ return;
+ }
+
+ lstrcat(buffer,"_System_DummyStr+");
+
+ sw=1;
+ while(1){
+ for(i3=0;;i2++,i3++){
+ if(Parameter[i2]=='\"'){
+ temporary[i3]=Parameter[i2];
+ for(i2++,i3++;;i2++,i3++){
+ temporary[i3]=Parameter[i2];
+ if(Parameter[i2]=='\"') break;
+ }
+ continue;
+ }
+ if(Parameter[i2]=='('){
+ i4=GetStringInPare(temporary+i3,Parameter+i2);
+ i2+=i4-1;
+ i3+=i4-1;
+ continue;
+ }
+ if(Parameter[i2]=='['){
+ i4=GetStringInBracket(temporary+i3,Parameter+i2);
+ i2+=i4-1;
+ i3+=i4-1;
+ continue;
+ }
+ if(Parameter[i2]==','||Parameter[i2]==';'){
+ temporary[i3]=0;
+ break;
+ }
+ temporary[i3]=Parameter[i2];
+ if(Parameter[i2]=='\0') break;
+ }
+
+ if(temporary[0]=='\0') lstrcat(buffer,"\"\"");
+ else{
+ int iResult;
+ iResult=IsStrCalculation(temporary);
+ if(iResult==-1){
+ //エラー
+ lstrcat(buffer,"\"\"");
+ }
+ else if(iResult){
+ //文字列
+ lstrcat(buffer,temporary);
+ }
+ else{
+ //数値
+ sprintf(buffer+lstrlen(buffer),"Str$(%s)",temporary);
+ }
+ }
+
+ if(Parameter[i2]==','){
+ if(bWrite) lstrcat(buffer,"+\",\"+");
+ else lstrcat(buffer,"+\"\t\"+");
+ }
+ else if(Parameter[i2]==';'){
+ if(Parameter[i2+1]=='\0'){
+ sw=0;
+ break;
+ }
+ if(bWrite) lstrcat(buffer,"+\",\"+");
+ else lstrcat(buffer,"+\" \"+");
+ }
+ else if(Parameter[i2]=='\0') break;
+
+ i2++;
+ }
+
+ if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
+
+ SUBINFO *psi;
+ if(bFile) psi=GetSubHash("PRINT_ToFile");
+ else psi=GetSubHash("PRINT_ToPrompt");
+ if(!psi){
+ SetError(3,"Print",cp);
+ return;
+ }
+ Opcode_CallProc(buffer,psi,0,0,"",0);
+}
+
+
+
+
+////////////
+// ポインタ
+////////////
+
+void OpcodeSetPtrData(char *Parameter,int type){
+ int i,i2;
+ char temporary[VN_SIZE];
+
+ if(Parameter[0]=='('){
+ i=JumpStringInPare(Parameter,1);
+ if(Parameter[i+1]=='\0'){
+ for(i=0;;i++){
+ Parameter[i]=Parameter[i+1];
+ if(Parameter[i]=='\0') break;
+ }
+ Parameter[i-1]=0;
+ }
+ }
+
+ //第1パラメータを取得
+ i=GetOneParameter(Parameter,0,temporary);
+ if(!Parameter[i]){
+ SetError(1,NULL,cp);
+ return;
+ }
+
+ int reg_ptr=REG_RAX;
+ i2=NumOpe(®_ptr,temporary,0,0,0);
+ if(!IsWholeNumberType(i2)){
+ SetError(11,Parameter,cp);
+ return;
+ }
+
+ //結果を格納しているレジスタをブロッキング
+ pobj_BlockReg->lock(reg_ptr);
+
+ //第2パラメータを取得
+ i=GetOneParameter(Parameter,i,temporary);
+ if(Parameter[i]){
+ SetError(1,NULL,cp);
+ return;
+ }
+
+ int temp_reg=REG_NON;
+ i2=NumOpe(&temp_reg,temporary,0,0,0);
+
+ //レジスタのブロッキングを解除
+ pobj_BlockReg->clear();
+
+ if(type==DEF_DOUBLE){
+ ChangeTypeToXmm_Double(i2,REG_XMM0,temp_reg);
+
+ //movsd qword ptr[reg_ptr],xmm0
+ op_movsd_MR(REG_XMM0,reg_ptr,0,MOD_BASE);
+ }
+ else if(type==DEF_SINGLE){
+ ChangeTypeToXmm_Single(i2,REG_XMM0,temp_reg);
+
+ //movss dword ptr[reg_ptr],xmm0
+ op_movss_MR(REG_XMM0,reg_ptr,0,MOD_BASE);
+ }
+ else{
+ ChangeTypeToWhole(i2,type,REG_RCX,temp_reg);
+
+ //mov ptr[reg_ptr],rcx
+ op_mov_MR(GetTypeSize(type,-1),REG_RCX,reg_ptr,0,MOD_BASE);
+ }
+}
Index: /BasicCompiler64/Compile_Var.cpp
===================================================================
--- /BasicCompiler64/Compile_Var.cpp (revision 3)
+++ /BasicCompiler64/Compile_Var.cpp (revision 3)
@@ -0,0 +1,1212 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+//変数
+VARIABLE *GlobalVar;
+int MaxGlobalVarNum;
+int AllGlobalVarSize;
+int AllInitGlobalVarSize;
+VARIABLE *LocalVar;
+int MaxLocalVarNum;
+int AllLocalVarSize;
+
+
+void SetRelativeOffset(int *pType,LONG_PTR lpIndex,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
+ int i2;
+
+
+ /////////////////////////////////////////////
+ // 先頭ポインタをr12に取得してメモリへ退避
+ /////////////////////////////////////////////
+
+ SetReg_WholeVariable(DEF_INT64,pRelativeVar,REG_R11);
+
+ //mov qword ptr[rsp+offset],r11 ※スタックフレームを利用
+ pobj_sf->push(REG_R11);
+
+
+ ////////////////////////////////
+ // 添え字を計算する
+ ////////////////////////////////
+
+ int reg=REG_NON;
+ i2=NumOpe(®,lpPtrOffset,0,0,0);
+ if(!IsWholeNumberType(i2)) SetError(46,NULL,cp);
+ ExtendTypeTo64(i2,reg);
+
+ if(reg==REG_R14){
+ //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R14);
+ }
+
+ if(PTR_LEVEL(*pType)){
+ *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1);
+ if((*pType)==DEF_OBJECT){
+ //imul reg,objsize
+ op_imul_value(sizeof(_int64),reg,GetSizeOfClassMember((CClass *)lpIndex,NULL,NULL));
+ }
+ else{
+ i2=GetTypeSize(*pType,-1);
+ if(i2>=2){
+ //imul reg,i2
+ op_imul_value(sizeof(_int64),reg,i2);
+ }
+ }
+ }
+ else{
+ //エラー
+ SetError(1,NULL,cp);
+ return;
+ }
+
+
+ //////////////////////////////
+ // 先頭ポインタに添え字を加算
+ //////////////////////////////
+
+ //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R11);
+
+ //add r11,reg
+ op_add64_reg(REG_R11,reg);
+}
+BOOL GetArrayOffset(int *SubScripts,char *array,int type,LONG_PTR lpIndex){
+ extern HANDLE hHeap;
+ int i,i2,i3,i4,TypeSize;
+ char temporary[VN_SIZE],*pParm[MAX_PARMS];
+
+ for(i=0,i2=0,i3=0;;i++,i2++){
+ if(array[i]=='('){
+ i4=GetStringInPare(temporary+i2,array+i);
+ i+=i4-1;
+ i2+=i4-1;
+ continue;
+ }
+ if(array[i]=='['){
+ i4=GetStringInBracket(temporary+i2,array+i);
+ i+=i4-1;
+ i2+=i4-1;
+ continue;
+ }
+ if(array[i]==','||array[i]=='\0'){
+ if(SubScripts[i3]==-1){
+ for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+ return 0;
+ }
+
+ temporary[i2]=0;
+
+ pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+ lstrcpy(pParm[i3],temporary);
+
+ i3++;
+
+ if(array[i]=='\0'){
+ if(SubScripts[i3]!=-1){
+ for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+ return 0;
+ }
+ break;
+ }
+
+ i2=-1;
+ continue;
+ }
+ temporary[i2]=array[i];
+ }
+
+ //mov qword ptr[rsp+offset],r11 ※スタックフレームを利用
+ pobj_sf->push(REG_R11);
+
+ //xor r12,r12
+ op_zero_reg(REG_R12);
+
+ for(i=i3-1;i>=0;i--){
+ //mov qword ptr[rsp+offset],r12 ※スタックフレームを利用
+ pobj_sf->push(REG_R12);
+
+ int reg=REG_NON;
+ TYPEINFO TypeInfo;
+ BOOL bUseHeap;
+ TypeInfo.type=NumOpe(®,pParm[i],DEF_LONG,-1,&TypeInfo.u.lpIndex,&bUseHeap);
+ if(TypeInfo.type==DEF_OBJECT){
+ //キャスト演算子のオーバーロードに対応する
+ CallCastOperatorProc(reg,
+ TypeInfo.type,TypeInfo.u.lpIndex,
+ bUseHeap,DEF_LONG,-1);
+ TypeInfo.type=DEF_LONG;
+ }
+
+ if(!IsWholeNumberType(TypeInfo.type)) SetError(46,NULL,cp);
+ ExtendTypeTo64(TypeInfo.type,reg);
+
+ if(reg==REG_R14){
+ //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R14);
+ }
+
+ //mov r12,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R12);
+
+ for(i2=i+1,i4=1;i2pop(REG_R11);
+
+ //add r11,r12
+ OpBuffer[obp++]=(char)0x4D;
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0xDC;
+
+ return 1;
+}
+BOOL GetMemberOffset(BOOL bError,CClass *pobj_c,char *member,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpNestIndex,BOOL bPrivateAccess){
+ int i,offset;
+
+
+ //////////////////////////////////////
+ // クラス、配列の構成要素を解析する
+ //////////////////////////////////////
+
+ char VarName[VN_SIZE]; //変数名
+ char array[VN_SIZE]; //第1次配列
+ char lpPtrOffset[VN_SIZE]; //第2次配列
+ char NestMember[VN_SIZE]; //入れ子メンバ
+ int RefType; //"."参照のときは0、"->"参照のときは1
+ lstrcpy(VarName,member);
+ if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
+
+
+ ////////////////////////////
+ // メンバオフセットを取得
+ ////////////////////////////
+
+ offset=GetSizeOfClassMember(pobj_c,VarName,&i);
+ if(i==pobj_c->iMemberNum){
+ if(bError) SetError(103,VarName,cp);
+ return 0;
+ }
+
+
+ //アクセシビリティをチェック
+ if(pobj_c==pobj_CompilingClass){
+ //同一クラスオブジェクトの場合はプライベートアクセスを容認する
+ if(pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
+ if(bError) SetError(107,VarName,cp);
+ return 0;
+ }
+ }
+ else{
+ if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
+ pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
+ if(bError) SetError(107,VarName,cp);
+ return 0;
+ }
+ else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED){
+ if(bError) SetError(108,VarName,cp);
+ return 0;
+ }
+ }
+
+ *pType=pobj_c->ppobj_Member[i]->TypeInfo.type;
+ *plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
+
+ //ポインタ変数の場合
+ if(IsPtrType(*pType)){
+ if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
+ lstrcpy(lpPtrOffset,array);
+ array[0]=0;
+ }
+ }
+ else{
+ if(lpPtrOffset[0]){
+ if(bError) SetError(16,member,cp);
+ return 0;
+ }
+ }
+
+ if(offset){
+ //add r11,offset
+ OpBuffer[obp++]=(char)0x49;
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC3;
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+
+ if(array[0]){
+ //配列オフセット
+ if(!GetArrayOffset(pobj_c->ppobj_Member[i]->SubScripts,array,*pType,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex)){
+ if(bError) SetError(14,member,cp);
+ }
+ }
+ else if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
+ *pType|=FLAG_PTR;
+ }
+
+ if(NestMember[0]){
+ //入れ子構造の場合
+
+ if(*pType==DEF_OBJECT){
+ if(RefType!=DEF_OBJECT){
+ if(bError) SetError(104,member,cp);
+ return 0;
+ }
+ }
+ else if(*pType==DEF_PTR_OBJECT){
+ //構造体ポインタ型メンバ変数
+
+ if(lpPtrOffset[0]){
+ //pObj[n].member
+ if(RefType!=DEF_OBJECT){
+ if(bError) SetError(104,member,cp);
+ return 0;
+ }
+
+ //直接参照に切り替え
+ SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ lpPtrOffset[0]=0;
+ }
+ else{
+ //pObj->member
+ if(RefType!=DEF_PTR_OBJECT){
+ if(bError) SetError(104,member,cp);
+ return 0;
+ }
+
+ if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+ //mov r11,qword ptr[r11]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_R11,0,MOD_BASE);
+ }
+ else{
+ //直接参照に切り替え
+ SetVarPtrToReg(REG_R12,pRelativeVar);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ //mov r11,qword ptr[r12]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE);
+ }
+ }
+ }
+ else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){
+ //構造体ポインタのポインタ型メンバ変数
+
+ if(lpPtrOffset[0]){
+ //ppObj[n]->member
+ if(RefType!=DEF_PTR_OBJECT){
+ if(bError) SetError(104,member,cp);
+ return 0;
+ }
+
+ //直接参照に切り替え
+ SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ lpPtrOffset[0]=0;
+
+ //mov r11,qword ptr[r11]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_R11,0,MOD_BASE);
+ }
+ else{
+ if(bError) SetError(104,member,cp);
+ return 0;
+ }
+ }
+
+ if(!GetMemberOffset(bError,
+ pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
+ NestMember,
+ pType,
+ pRelativeVar,
+ plpNestIndex,
+ 0)) return 0;
+ }
+
+ if(lpPtrOffset[0]){
+ SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+ }
+
+ return 1;
+}
+void GetWithName(char *buffer){
+ extern WITHINFO WithInfo;
+ int i;
+
+ buffer[0]=0;
+ for(i=0;i=0;i--){ //レキシカルスコープを考慮してバックサーチ
+ if(LocalVar[i].bLiving){
+ if(lstrcmp(VarName,LocalVar[i].name)==0) break;
+ }
+ }
+ if(i>=0){
+ //ポインタ変数の場合
+ if(IsPtrType(LocalVar[i].type)){
+ if(LocalVar[i].SubScripts[0]==-1){
+ lstrcpy(lpPtrOffset,array);
+ array[0]=0;
+ }
+ }
+ else{
+ if(lpPtrOffset[0]){
+ SetError(16,variable,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+ }
+
+ pRelativeVar->offset=-LocalVar[i].offset;
+ pRelativeVar->bOffsetOffset=0;
+ if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL;
+ else pRelativeVar->dwKind=VAR_LOCAL;
+ *pType=LocalVar[i].type;
+ lpIndex=LocalVar[i].u.index;
+ if(plpIndex) *plpIndex=lpIndex;
+ pSubScripts=LocalVar[i].SubScripts;
+
+ goto ok;
+ }
+ }
+
+
+ if(pobj_CompilingClass){
+ //////////////////////
+ // クラスメンバの参照
+ //////////////////////
+
+ if(lstrcmpi(variable,"This")==0){
+ //自身のオブジェクトのThisポインタをr11にコピー
+ SetThisPtrToReg(REG_R11);
+
+ *pType=DEF_OBJECT;
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ if(plpIndex) *plpIndex=(LONG_PTR)pobj_CompilingClass;
+ return 1;
+ }
+
+ if(memicmp(variable,"This.",5)==0){
+ //Thisオブジェクトのメンバを参照するとき
+ SlideString(variable+5,-5);
+ lstrcpy(VarName,variable);
+ }
+ else{
+ //クラス内メンバを参照するとき(通常)
+
+ for(i=0;iiMemberNum;i++){
+ if(lstrcmp(VarName,pobj_CompilingClass->ppobj_Member[i]->name)==0) break;
+ }
+ if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
+ }
+
+ //自身のオブジェクトのThisポインタをr11にコピー
+ SetThisPtrToReg(REG_R11);
+
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+ if(!GetMemberOffset(bError,pobj_CompilingClass,variable,pType,pRelativeVar,&lpIndex,1)) return 0;
+ if(plpIndex) *plpIndex=lpIndex;
+ return 1;
+ }
+
+NonClassMember:
+
+ //////////////////////////
+ // 静的ローカル変数
+ // ※"Static.Object.Method.Variable"
+ //////////////////////////
+
+ char temporary[VN_SIZE];
+ extern SUBINFO *pCompilingSubInfo;
+ if(pCompilingSubInfo){
+ GetNowStaticVarFullName(VarName,temporary);
+
+ for(i=0;i=0;i--){ //レキシカルスコープを考慮してバックサーチ
+ if(GlobalVar[i].bLiving){
+ if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
+ }
+ }
+ if(i>=0){
+ goto GlobalOk;
+ }
+
+
+ //////////////////////////
+ // クラスの静的メンバ
+ //////////////////////////
+
+ if(member[0]){
+ lstrcpy(temporary,member);
+ GetVarFormatString(temporary,array,lpPtrOffset,member,&i);
+
+ char temp2[VN_SIZE];
+ sprintf(temp2,"%s.%s",VarName,temporary);
+ for(i=0;iname,VarName);
+ for(i=0;idwKind=NON_VAR;
+ return 0;
+
+
+
+GlobalOk:
+ //ポインタ変数の場合
+ if(IsPtrType(GlobalVar[i].type)){
+ if(GlobalVar[i].SubScripts[0]==-1){
+ lstrcpy(lpPtrOffset,array);
+ array[0]=0;
+ }
+ }
+ else{
+ if(lpPtrOffset[0]){
+ SetError(16,variable,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+ }
+
+ pRelativeVar->offset=GlobalVar[i].offset;
+ pRelativeVar->bOffsetOffset=0;
+ pRelativeVar->dwKind=VAR_GLOBAL;
+ *pType=GlobalVar[i].type;
+ lpIndex=GlobalVar[i].u.index;
+ if(plpIndex) *plpIndex=lpIndex;
+ pSubScripts=GlobalVar[i].SubScripts;
+
+
+
+ok:
+
+
+ if(array[0]==0&&pSubScripts[0]!=-1){
+ //配列の先頭ポインタを示す場合
+ *pType|=FLAG_PTR;
+ if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
+ return 1;
+ }
+
+ if(array[0]||member[0]){
+ //xor r11,r11(r11を0に初期化する)
+ //※r11は変数ベースアドレスからの相対オフセットを示す
+ op_zero_reg(REG_R11);
+
+ pRelativeVar->bOffsetOffset=1;
+ }
+ if(array[0]){
+ if(!GetArrayOffset(pSubScripts,array,*pType,lpIndex)){
+ SetError(14,variable,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+ }
+ if(member[0]){
+ if(*pType==DEF_OBJECT){
+ //実態オブジェクトのメンバを参照(obj.member)
+ if(RefType!=DEF_OBJECT){
+ SetError(104,VarName,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+
+ LONG_PTR lp2;
+ if(!GetMemberOffset(bError,(CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0)) return 0;
+ if(plpIndex) *plpIndex=lp2;
+ }
+ else if(*pType==DEF_PTR_OBJECT){
+ //ポインタオブジェクトが示すメンバを参照
+ if(lpPtrOffset[0]){
+ //pObj[n].member
+ if(RefType!=DEF_OBJECT){
+ SetError(104,VarName,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+ SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ LONG_PTR lp2;
+ if(!GetMemberOffset(bError,(CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0)) return 0;
+ if(plpIndex) *plpIndex=lp2;
+ }
+ else{
+ //pObj->member
+ if(RefType!=DEF_PTR_OBJECT){
+ SetError(104,VarName,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+
+ SetVarPtrToReg(REG_R12,pRelativeVar);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ //mov r11,qword ptr[r12]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE);
+
+ LONG_PTR lp2;
+ if(!GetMemberOffset(bError,(CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0)) return 0;
+ if(plpIndex) *plpIndex=lp2;
+ }
+ }
+ else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){
+ //ポインタオブジェクトが示すメンバを参照
+ if(lpPtrOffset[0]){
+ //ppObj[n]->member
+ if(RefType!=DEF_PTR_OBJECT){
+ SetError(104,VarName,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+
+ SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+
+ SetVarPtrToReg(REG_R12,pRelativeVar);
+
+ //mov r11,qword ptr[r12]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE);
+
+ LONG_PTR lp2;
+ if(!GetMemberOffset(bError,(CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0)) return 0;
+ if(plpIndex) *plpIndex=lp2;
+ }
+ else{
+ SetError(104,VarName,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+ }
+ else{
+ SetError(102,VarName,cp);
+ pRelativeVar->dwKind=NON_VAR;
+ return 0;
+ }
+ return 1;
+ }
+
+ if(lpPtrOffset[0]){
+ SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+ }
+
+ return 1;
+}
+
+BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf){
+ extern BYTE *initGlobalBuf;
+ int i,i2,i3,TypeSize;
+ char temporary[VN_SIZE];
+
+ if(InitBuf[0]=='['){
+ SlideString(InitBuf+1,-1);
+ InitBuf[lstrlen(InitBuf)-1]=0;
+
+ TypeSize=GetTypeSize(type,lpIndex);
+
+ if(SubScripts[0]!=-1){
+ TypeSize*=JumpSubScripts(SubScripts+1);
+ i=0;
+ i2=0;
+ while(1){
+ if(SubScripts[0]iMemberNum;i2++){
+ i=GetOneParameter(InitBuf,i,temporary);
+
+ i3=GetSizeOfClassMember(pobj_c,pobj_c->ppobj_Member[i2]->name,NULL);
+
+ if(!SetInitGlobalData(offset+i3,
+ pobj_c->ppobj_Member[i2]->TypeInfo.type,
+ pobj_c->ppobj_Member[i2]->TypeInfo.u.lpIndex,
+ pobj_c->ppobj_Member[i2]->SubScripts,
+ temporary)) return 0;
+
+ if(InitBuf[i]=='\0') break;
+ }
+ if(i2+1!=pobj_c->iMemberNum){
+ SetError(41,0,cp);
+ return 0;
+ }
+ return 1;
+ }
+
+ SetError(41,0,cp);
+ return 0;
+ }
+
+ if(SubScripts[0]!=-1){
+ SetError(41,0,cp);
+ return 0;
+ }
+
+ double dbl;
+ _int64 i64data;
+ int CalcType;
+ LONG_PTR lpCalcIndex;
+
+ CalcType=StaticCalculation(true, InitBuf,type,&i64data,&lpCalcIndex);
+ if(IsRealNumberType(CalcType)){
+ memcpy(&dbl,&i64data,sizeof(double));
+ i64data=(_int64)dbl;
+ }
+ else dbl=(double)i64data;
+
+ //型チェック
+ CheckDifferentType(
+ type,
+ lpIndex,
+ CalcType,
+ lpCalcIndex,
+ 0,0);
+
+ if(type==DEF_DOUBLE)
+ *(double *)(initGlobalBuf+offset)=(double)dbl;
+ else if(type==DEF_SINGLE)
+ *(float *)(initGlobalBuf+offset)=(float)dbl;
+ else if(type==DEF_INT64||type==DEF_QWORD||IsPtrType(type)){
+ if(type==DEF_PTR_BYTE&&lpCalcIndex==LITERAL_STRING){
+ //文字列定数のとき
+
+ char *temp;
+ temp=(char *)i64data;
+ i2=AddDataTable(temp,lstrlen(temp));
+ HeapDefaultFree(temp);
+
+ //mov rax,DataPos
+ op_mov_RV(sizeof(_int64),REG_RAX,i2);
+ obp-=sizeof(long);
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+
+ //mov qword ptr[offset],rax
+ op_mov_MR(sizeof(_int64),REG_RAX,0,offset,MOD_DISP32);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ else{
+ *(_int64 *)(initGlobalBuf+offset)=i64data;
+ }
+ }
+ else if(type==DEF_LONG||type==DEF_DWORD)
+ *(DWORD *)(initGlobalBuf+offset)=(DWORD)i64data;
+ else if(type==DEF_INTEGER||type==DEF_WORD)
+ *(WORD *)(initGlobalBuf+offset)=(WORD)i64data;
+ else if(type==DEF_CHAR||type==DEF_BYTE)
+ *(BYTE *)(initGlobalBuf+offset)=(BYTE)i64data;
+
+ return 1;
+}
+BOOL InitLocalVar(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf){
+ int i,i2,i3,TypeSize;
+ char temporary[VN_SIZE];
+
+ if(InitBuf[0]=='['){
+ SlideString(InitBuf+1,-1);
+ InitBuf[lstrlen(InitBuf)-1]=0;
+
+ TypeSize=GetTypeSize(type,lpIndex);
+
+ if(SubScripts[0]!=-1){
+ TypeSize*=JumpSubScripts(SubScripts+1);
+ i=0;
+ i2=0;
+ while(1){
+ if(SubScripts[0]iMemberNum;i2++){
+ i=GetOneParameter(InitBuf,i,temporary);
+
+ i3=GetSizeOfClassMember(pobj_c,pobj_c->ppobj_Member[i2]->name,NULL);
+
+ if(!InitLocalVar(offset+i3,
+ pobj_c->ppobj_Member[i2]->TypeInfo.type,
+ pobj_c->ppobj_Member[i2]->TypeInfo.u.lpIndex,
+ pobj_c->ppobj_Member[i2]->SubScripts,
+ temporary)) return 0;
+
+ if(InitBuf[i]=='\0') break;
+ }
+ if(i2+1!=pobj_c->iMemberNum){
+ SetError(41,0,cp);
+ return 0;
+ }
+ return 1;
+ }
+
+ SetError(41,0,cp);
+ return 0;
+ }
+
+ if(SubScripts[0]!=-1){
+ SetError(41,0,cp);
+ return 0;
+ }
+
+ double dbl;
+ _int64 i64data;
+ int CalcType;
+ LONG_PTR lpCalcIndex;
+ CalcType=StaticCalculation(true, InitBuf,type,&i64data,&lpCalcIndex);
+ if(IsRealNumberType(CalcType)){
+ memcpy(&dbl,&i64data,sizeof(double));
+ i64data=(_int64)dbl;
+ }
+ else dbl=(double)i64data;
+
+ //型チェック
+ CheckDifferentType(
+ type,
+ lpIndex,
+ CalcType,
+ lpCalcIndex,
+ 0,0);
+
+ if(type==DEF_DOUBLE){
+ memcpy(&i64data,&dbl,sizeof(double));
+
+ //mov rax,i64data
+ op_mov64_ToReg(REG_RAX,i64data);
+
+ //mov qword ptr[rsp+offset],rax
+ op_mov_MR(sizeof(_int64),REG_RAX,REG_RSP,offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else if(type==DEF_SINGLE){
+ float flt;
+ flt=(float)dbl;
+
+ //mov dword ptr[rsp+offset],value
+ op_mov_MV(sizeof(long),REG_RSP,offset,USE_OFFSET,*(int *)&flt);
+ obp-=sizeof(long)+sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long)+sizeof(long);
+ }
+ else if(type==DEF_INT64||type==DEF_QWORD||IsPtrType(type)){
+ if(type==DEF_PTR_BYTE&&lpCalcIndex==LITERAL_STRING){
+ //文字列定数のとき
+
+ char *temp;
+ temp=(char *)i64data;
+ i2=AddDataTable(temp,lstrlen(temp));
+ HeapDefaultFree(temp);
+
+ //mov rax,i2
+ op_mov_RV(sizeof(_int64),REG_RAX,i2);
+ obp-=sizeof(long);
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+
+ //mov qword ptr[rsp+offset],rax
+ op_mov_MR(sizeof(_int64),REG_RAX,REG_RSP,offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ if(i64data&0xFFFFFFFF00000000){
+ //mov rax,i64data
+ op_mov64_ToReg(REG_RAX,i64data);
+
+ //mov qword ptr[rsp+offset],rax
+ op_mov_MR(sizeof(_int64),REG_RAX,REG_RSP,offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov qword ptr[rsp+offset],value
+ op_mov_MV(sizeof(_int64),REG_RSP,offset,USE_OFFSET,(int)i64data);
+ obp-=sizeof(long)+sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long)+sizeof(long);
+ }
+ }
+ }
+ else if(type==DEF_LONG||type==DEF_DWORD){
+ //mov dword ptr[rsp+offset],value
+ op_mov_MV(sizeof(long),REG_RSP,offset,USE_OFFSET,(int)i64data);
+ obp-=sizeof(long)+sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long)+sizeof(long);
+ }
+ else if(type==DEF_INTEGER||type==DEF_WORD){
+ //mov word ptr[rsp+offset],value
+ op_mov_MV(sizeof(short),REG_RSP,offset,USE_OFFSET,(int)i64data);
+ obp-=sizeof(long)+sizeof(short);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long)+sizeof(short);
+ }
+ else if(type==DEF_CHAR||type==DEF_BYTE){
+ //mov byte ptr[rsp+offset],value
+ op_mov_MV(sizeof(char),REG_RSP,offset,USE_OFFSET,(int)i64data);
+ obp-=sizeof(long)+sizeof(char);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long)+sizeof(char);
+ }
+ return 1;
+}
+
+
+void dim(char *Parameter,DWORD dwFlag){
+ extern BOOL bCompilingGlobal;
+ extern HANDLE hHeap;
+ int i2,i3,VarSize;
+
+ //構文を解析
+ char VarName[VN_SIZE];
+ int SubScripts[MAX_ARRAYDIM];
+ TYPEINFO TypeInfo;
+ char InitBuf[8192];
+ char ConstractParameter[VN_SIZE];
+ if(!GetDimentionFormat(Parameter,VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))
+ return;
+
+ //タイプサイズを取得
+ int TypeSize;
+ TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
+
+ //定数と2重定義されていないかを調べる
+ if(GetConstHash(VarName)){
+ SetError(15,VarName,cp);
+ return;
+ }
+
+ if(dwFlag&DIMFLAG_STATIC){
+ if(bCompilingGlobal){
+ SetError(60,NULL,cp);
+ return;
+ }
+
+ /////////////////////
+ // Static変数
+ // ※"Static.Object.Method.Variable"
+ /////////////////////
+
+ char temporary[VN_SIZE];
+ GetNowStaticVarFullName(VarName,temporary);
+
+ AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
+
+ /*
+ Note: 静的変数のコンストラクタ呼び出しは
+ _System_InitStaticLocalVariables関数内で一括して行う
+ */
+ }
+ else{
+ if(bCompilingGlobal){
+ /////////////////////////
+ // グローバル変数
+ /////////////////////////
+
+ AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
+ }
+ else{
+ /////////////////
+ // ローカル変数
+ /////////////////
+
+ for(i2=0;i2IsHoldAbstractFunction()){
+ //抽象クラスだったとき
+ SetError(125,TypeInfo.u.pobj_Class->name,cp);
+ }
+ }
+}
+void OpcodeDim(char *Parameter,DWORD dwFlag){
+ int i,i2,i3,IsStr=0;
+ char temporary[8192];
+
+ for(i=0,i2=0;;i++,i2++){
+ if(Parameter[i]=='\"') IsStr^=1;
+ if(Parameter[i]=='('&&IsStr==0){
+ i3=GetStringInPare(temporary+i2,Parameter+i);
+ i+=i3-1;
+ i2+=i3-1;
+ continue;
+ }
+ if(Parameter[i]=='['&&IsStr==0){
+ i3=GetStringInBracket(temporary+i2,Parameter+i);
+ i+=i3-1;
+ i2+=i3-1;
+ continue;
+ }
+ if((Parameter[i]==','&&IsStr==0)||
+ Parameter[i]=='\0'){
+ temporary[i2]=0;
+
+ dim(temporary,dwFlag);
+
+ if(Parameter[i]=='\0') break;
+ i2=-1;
+ continue;
+ }
+ temporary[i2]=Parameter[i];
+ }
+}
+
+void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar){
+ if(!IsGeneralReg(reg)) SetError(300,NULL,cp);
+
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add r11,offset
+ OpBuffer[obp++]=(char)0x49;
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC3;
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+
+ //mov reg,r11
+ op_mov64_ToReg_FromReg(reg,REG_R11);
+ }
+ else{
+ //mov reg,offset
+ op_mov64_ToReg(reg,(int)pRelativeVar->offset);
+ obp-=sizeof(long);
+ pobj_GlobalVarSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add r11,offset
+ OpBuffer[obp++]=(char)0x49;
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC3;
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+
+ //add r11,rsp
+ op_add64_reg(REG_R11,REG_RSP);
+
+ //mov reg,r11
+ op_mov64_ToReg_FromReg(reg,REG_R11);
+ }
+ else{
+ //mov reg,rsp
+ op_mov64_ToReg_FromReg(reg,REG_RSP);
+
+ //add reg,offset
+ op_add64_value(reg,(int)pRelativeVar->offset);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ if(pRelativeVar->bOffsetOffset){
+ //add r11,qword ptr[rsp+offset]
+ OpBuffer[obp++]=(char)0x4C;
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)0x9C;
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=(int)pRelativeVar->offset;
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+ else{
+ //mov r11,qword ptr[rsp+offset]
+ op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+ obp-=sizeof(long);
+ AddLocalVarAddrSchedule();
+ obp+=sizeof(long);
+ }
+
+ goto directmem;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+ //mov reg,r11
+ op_mov64_ToReg_FromReg(reg,REG_R11);
+ }
+}
Index: /BasicCompiler64/Debug.cpp
===================================================================
--- /BasicCompiler64/Debug.cpp (revision 3)
+++ /BasicCompiler64/Debug.cpp (revision 3)
@@ -0,0 +1,677 @@
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+ULONG_PTR rva_to_real(DWORD p){
+ extern DWORD ImageBase;
+ extern int MemPos_CodeSection;
+ return p+ImageBase+MemPos_CodeSection;
+}
+
+void ShowVarList(DEBUG_EVENT *pde,BOOL bExit){
+ extern DWORD ImageBase;
+ extern DWORD _DebugSys_dwThreadID[256];
+ extern HANDLE hDebugProcess;
+ extern int MemPos_RWSection;
+ SIZE_T stAccBytes;
+ ReadProcessMemory(hDebugProcess,
+ (void *)(LONG_PTR)(ImageBase+MemPos_RWSection),
+ _DebugSys_dwThreadID,sizeof(DWORD)*256,&stAccBytes);
+
+ //デバッグダイアログを表示
+ extern HINSTANCE hInst;
+ extern HWND hMainDlg;
+ extern HWND hDebugWnd;
+ extern DWORD dwStepRun;
+ dwStepRun=0;
+ if(!hDebugWnd) SendMessage(hMainDlg,WM_SHOWVARLIST,0,pde->dwThreadId);
+ else InitVarList(pde->dwThreadId);
+
+ if(bExit){
+ //"中断"
+ SetDlgItemText(hMainDlg,IDOK,STRING_CLOSE);
+
+ extern HWND hDebuggerToolbar;
+ SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_START,TBSTATE_INDETERMINATE);
+ SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_STEPOVER,TBSTATE_INDETERMINATE);
+ SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_STEPIN,TBSTATE_INDETERMINATE);
+ }
+ else{
+ //"継続"
+ SetDlgItemText(hDebugWnd,IDCANCEL,STRING_CONTINUE);
+ }
+ while(hDebugWnd&&dwStepRun==0) Sleep(1);
+}
+void DebugMessage(char *buffer){
+ extern HWND hMainDlg;
+ int pos;
+
+ if(!IsWindowEnabled(GetDlgItem(hMainDlg,IDC_DEBUGLIST))){
+ SetDlgItemText(hMainDlg,IDC_DEBUGLIST,"");
+ EnableWindow(GetDlgItem(hMainDlg,IDC_DEBUGLIST),1);
+ }
+
+ pos=GetWindowTextLength(GetDlgItem(hMainDlg,IDC_DEBUGLIST));
+ SendDlgItemMessage(hMainDlg,IDC_DEBUGLIST,EM_SETSEL,pos,pos);
+ SendDlgItemMessage(hMainDlg,IDC_DEBUGLIST,EM_REPLACESEL,0,(LPARAM)buffer);
+}
+SUBINFO *GetSubFromObp(ULONG_PTR pos){
+ extern SUBINFO **ppSubHash;
+ SUBINFO *psi;
+ int i2;
+
+ for(i2=0;i2CompileAddress) <= pos &&
+ pos < rva_to_real(psi->EndOpAddr))
+ return psi;
+
+ psi=psi->pNextData;
+ }
+ }
+ return 0;
+}
+void ReleaseSingleStep(HANDLE hThread,CONTEXT *pContext){
+ //以前にシングルステップ実行をした場合
+ extern HANDLE hDebugProcess;
+ extern DWORD *lpdwDebugThreadID;
+ extern HANDLE *lphDebugThread;
+ extern int DebugThreadNum;
+ extern DWORD ImageBase;
+ extern int MemPos_CodeSection;
+ extern int FileSize_CodeSection;
+ extern char *OpBuffer;
+ int i2;
+ SIZE_T stAccBytes;
+
+ //シングルステップOFF
+ WriteProcessMemory(hDebugProcess,
+ (void *)(LONG_PTR)(ImageBase+MemPos_CodeSection),
+ OpBuffer,FileSize_CodeSection,&stAccBytes);
+
+ if(ImageBase+MemPos_CodeSection <= pContext->Rip &&
+ pContext->Rip < ImageBase+MemPos_CodeSection+FileSize_CodeSection){
+ //オリジナルコード内のみ、シングルステップ用の"int 3"を考慮
+ pContext->Rip--;
+ SetThreadContext(hThread,pContext);
+ }
+
+ //他のスレッドのサスペンドを解除
+ for(i2=0;i2CompileAddress)-(long)Context.Rip){
+ //プロシージャの終端位置の場合はステップインを行う
+ goto StepIn;
+ }
+
+ //スレッドのプロシージャ実行状況を取得
+ bRet=ReadProcessMemory(hDebugProcess,
+ (void *)(LONG_PTR)(ImageBase+MemPos_RWSection),
+ dwData,sizeof(DWORD)*256,&stAccBytes);
+ if(!bRet) MessageBox(hMainDlg,"プロセスメモリーの読み込みに失敗","error",MB_OK);
+ for(i2=0;;i2++){
+ if(dwData[i2]==de.dwThreadId) break;
+ }
+ GetDebugThreadInfo(i2);
+
+ extern int GlobalOpBufferSize;
+ extern DEBUG_PROCINFO dpi;
+ if(ImageBase+MemPos_CodeSection<=dpi.lpqwObp[dpi.num]&&
+ dpi.lpqwObp[dpi.num]CompileAddress),
+ SingleStepCodeBuffer+psi->CompileAddress,
+ psi->EndOpAddr-psi->CompileAddress,
+ &stAccBytes);
+ }
+ DeleteDebugThreadInfo();
+
+ //次の命令語のブレーク命令は解除しておく(シングルステップ実行後のみ)
+ //(オリジナルコード内のみ)
+ if(i3&&ImageBase+MemPos_CodeSection<=Context.Rip&&Context.RipbCompile)
+ HeapDefaultFree(psi->pVar);
+
+ psi=psi->pNextData;
+ }
+ }
+
+ //列挙型に関するメモリを解放
+ DeleteEnumInfo();
+
+ //クラスに関するメモリを解放
+ delete pobj_DBClass;
+ pobj_DBClass=0;
+
+ //サブルーチン情報のメモリ解放
+ DeleteSubInfo();
+
+ //定数に関する情報を解放
+ DeleteConstInfo();
+
+ //ソースコードを解放
+ extern char *pBaseBuffer;
+ HeapDefaultFree(pBaseBuffer);
+
+ //コードと行番号の関係を解放
+ extern LINEINFO *pLineInfo;
+ HeapDefaultFree(pLineInfo);
+
+ //コードバッファを解放
+ extern char *OpBuffer;
+ if(OpBuffer){
+ HeapDefaultFree(OpBuffer);
+ OpBuffer=0;
+ }
+}
Index: /BasicCompiler64/FunctionValue.h
===================================================================
--- /BasicCompiler64/FunctionValue.h (revision 3)
+++ /BasicCompiler64/FunctionValue.h (revision 3)
@@ -0,0 +1,22 @@
+/* 関数定数 */
+
+//データ型変換
+#define FUNC_CUDBL 0x0210
+
+//文字列
+#define FUNC_LEN 0x031D
+
+//メモリ操作
+#define FUNC_VARPTR 0x0591
+
+//その他
+#define FUNC_ADDRESSOF 0x0619
+#define FUNC_SIZEOF 0x0620
+
+//ポインタ
+#define FUNC_GETDOUBLE 0x0630
+#define FUNC_GETSINGLE 0x0631
+#define FUNC_GETQWORD 0x0632
+#define FUNC_GETDWORD 0x0634
+#define FUNC_GETWORD 0x0635
+#define FUNC_GETBYTE 0x0636
Index: /BasicCompiler64/InsertOpcode.cpp
===================================================================
--- /BasicCompiler64/InsertOpcode.cpp (revision 3)
+++ /BasicCompiler64/InsertOpcode.cpp (revision 3)
@@ -0,0 +1,43 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+////////////////////////////////////
+// 再配置が必要なステートメント
+////////////////////////////////////
+
+
+
+int DimStatementInsertPoint;
+
+void InsertDimStatement_ToProcHead(char *lpszCommand){
+ char *temp_buffer;
+ int temp_size;
+
+ temp_size=obp-DimStatementInsertPoint;
+ temp_buffer=(char *)HeapAlloc(hHeap,0,temp_size);
+ memcpy(temp_buffer,OpBuffer+DimStatementInsertPoint,temp_size);
+
+ //各種スケジューリング情報を再配置
+ NativeBuffer_StaticRelocation(DimStatementInsertPoint,temp_size,0x10000000);
+
+ int back_obp;
+ back_obp=obp;
+ obp=DimStatementInsertPoint;
+
+ //OpcodeDim(lpszCommand,0);
+ OpBuffer[obp++]=(char)0xcc;
+ OpcodeDim(lpszCommand,DIMFLAG_NONCALL_CONSTRACTOR);
+
+ int obp_offset;
+ obp_offset=obp-DimStatementInsertPoint;
+
+ memcpy(OpBuffer+obp,temp_buffer,temp_size);
+
+ HeapDefaultFree(temp_buffer);
+
+ obp+=temp_size;
+
+
+ //各種スケジューリング情報を再配置
+ NativeBuffer_StaticRelocation(DimStatementInsertPoint+0x10000000,temp_size,obp_offset-0x10000000);
+}
Index: /BasicCompiler64/MakePeHdr.cpp
===================================================================
--- /BasicCompiler64/MakePeHdr.cpp (revision 3)
+++ /BasicCompiler64/MakePeHdr.cpp (revision 3)
@@ -0,0 +1,1691 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+////////////////////////////
+// 特殊関数の構造体ポインタ
+////////////////////////////
+SUBINFO
+ *pSub_System_StartupProgram,
+ *pSub_DebugSys_StartProc,
+ *pSub_DebugSys_EndProc,
+ *pSub_DebugSys_SaveContext,
+ *pSub_System_GetEip,
+ *pSub_System_InitDllGlobalVariables,
+ *pSub_System_InitStaticLocalVariables,
+ *pSub_System_Call_Destructor_of_GlobalObject,
+ *pSub_System_GetSp,
+ *pSub_pow,
+ *pSub_calloc,
+ *pSub_realloc,
+ *pSub_free;
+
+
+//////////////////////////////
+// 各セクションの位置とサイズ
+int FileSize_CodeSection,
+ FileSize_ExportSection,
+ FileSize_ImportSection,
+ FileSize_DataSection,
+ FileSize_RWSection,
+ FileSize_RSrcSection,
+ FileSize_RelocSection,
+ FileSize_DebugSection;
+int FilePos_CodeSection,
+ FilePos_ExportSection,
+ FilePos_ImportSection,
+ FilePos_DataSection,
+ FilePos_RWSection,
+ FilePos_RSrcSection,
+ FilePos_RelocSection,
+ FilePos_DebugSection;
+int MemSize_CodeSection,
+ MemSize_ExportSection,
+ MemSize_ImportSection,
+ MemSize_DataSection,
+ MemSize_RWSection,
+ MemSize_RSrcSection,
+ MemSize_RelocSection,
+ MemSize_DebugSection;
+int MemPos_CodeSection,
+ MemPos_ExportSection,
+ MemPos_ImportSection,
+ MemPos_DataSection,
+ MemPos_RWSection,
+ MemPos_RSrcSection,
+ MemPos_RelocSection,
+ MemPos_DebugSection;
+int bUse_CodeSection,
+ bUse_ExportSection,
+ bUse_ImportSection,
+ bUse_DataSection,
+ bUse_RWSection,
+ bUse_RSrcSection,
+ bUse_RelocSection,
+ bUse_DebugSection;
+
+int AddDataTable(char *buffer,int length){
+ extern HANDLE hHeap;
+ extern char *DataTable;
+ extern int DataTableSize;
+ int RetNum;
+
+ DataTable=(char *)HeapReAlloc(hHeap,0,DataTable,DataTableSize+length+1);
+ memcpy(DataTable+DataTableSize,buffer,length);
+ DataTable[DataTableSize+length]=0;
+
+ RetNum=DataTableSize; //ImageBase+MemPos_DataSectionが後に足される
+
+ DataTableSize+=length+1;
+
+ return RetNum;
+}
+
+
+void DebugVariable(void){
+ char temporary[255];
+ sprintf(temporary,"_DebugSys_dwThreadID[255]%c%cDWord",1,ESC_AS);
+ OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+ sprintf(temporary,"_DebugSys_ProcNum[255]%c%cDWord",1,ESC_AS);
+ OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+ sprintf(temporary,"_DebugSys_lplpObp[255]%c%c*ULONG_PTR",1,ESC_AS);
+ OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+ sprintf(temporary,"_DebugSys_lplpSpBase[255]%c%c*ULONG_PTR",1,ESC_AS);
+ OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+}
+
+void Compile(void){
+ extern HWND hMainDlg;
+ extern HWND hOwnerEditor;
+ extern HANDLE hHeap;
+ extern BOOL bDebugCompile;
+ extern BOOL bDll;
+ extern DWORD ImageBase;
+ extern int obp_AllocSize;
+ extern char *basbuf;
+ extern char OutputFileName[MAX_PATH];
+ int i,i2,i3,i4,i5;
+ char temporary[MAX_PATH],*temp2;
+ HANDLE hFile;
+
+
+ //コードセクションのメモリ上の位置
+ MemPos_CodeSection= 0x1000;
+
+ //データセクションのメモリ上の位置(仮定)
+ MemPos_DataSection= 0x10000000;
+
+
+ //エクスポート セクションを利用するかどうか
+ if(bDll) bUse_ExportSection=1;
+ else bUse_ExportSection=0;
+
+
+ //////////////////
+ // データテーブル
+ extern char *DataTable;
+ extern int DataTableSize;
+ if(bDebugCompile){
+ DataTable=(char *)HeapAlloc(hHeap,0,2);
+ DataTable[0]=2;
+ DataTable[1]=0;
+ DataTableSize=2;
+ }
+ else{
+ DataTable=(char *)HeapAlloc(hHeap,0,1);
+ DataTableSize=0;
+ }
+
+
+ //////////////////////
+ // コード生成前の準備
+ //////////////////////
+
+ //重複エラー情報管理のメモリを確保(グローバル領域コンパイル用)
+ extern char **SynonymErrorWords;
+ extern int SynonymErrorNum;
+ SynonymErrorNum=0;
+ SynonymErrorWords=(char **)HeapAlloc(hHeap,0,1);
+
+ //列挙体に関する情報の初期化
+ CEnumParent::InitEnum();
+
+ //列挙体からクラスコードを生成
+ char *temp;
+ temp=CEnumParent::GenerateCodes();
+ AddSourceCode(temp);
+ HeapDefaultFree(temp);
+
+ //関数ポインタ情報を初期化
+ extern PROCPTRINFO *pProcPtrInfo;
+ extern int ProcPtrInfoNum;
+ pProcPtrInfo=(PROCPTRINFO *)HeapAlloc(hHeap,0,1);
+ ProcPtrInfoNum=0;
+
+ //クラス名を取得(詳細情報はGetObjectClassInfoで取得)
+ // GetSubInfo関数の中で参照されるオブジェクト名を事前に取得する。
+ // ※オブジェクトの内容までは取得しない
+ pobj_DBClass=new CDBClass();
+ pobj_DBClass->InitNames();
+
+ //定数情報を取得
+ GetConstInfo();
+
+ //サブルーチン(ユーザー定義、DLL関数)の識別子、アドレスを取得
+ pobj_CompilingClass=0;
+ GetSubInfo();
+
+ //クラス情報を取得(※注 - GetSubInfoの後に呼び出す)
+ pobj_DBClass->GetObjectClassInfo();
+
+ //コードと行番号の関係
+ extern LINEINFO *pLineInfo;
+ extern int MaxLineInfoNum;
+ pLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,1);
+ MaxLineInfoNum=0;
+
+
+ ///////////////////////////
+ // 最低限必要な関数を取得
+ ///////////////////////////
+ cp=-1;
+
+ if(pSub_System_StartupProgram=GetSubHash("_System_StartupProgram",1))
+ pSub_System_StartupProgram->bUse=1;
+
+ if(pSub_DebugSys_StartProc=GetSubHash("_DebugSys_StartProc",1))
+ pSub_DebugSys_StartProc->bUse=1;
+
+ if(pSub_DebugSys_EndProc=GetSubHash("_DebugSys_EndProc",1))
+ pSub_DebugSys_EndProc->bUse=1;
+
+ if(pSub_DebugSys_SaveContext=GetSubHash("_DebugSys_SaveContext",1))
+ pSub_DebugSys_SaveContext->bUse=1;
+
+ if(pSub_System_GetEip=GetSubHash("_System_GetEip",1)){
+ pSub_System_GetEip->bUse=1;
+ pSub_System_GetEip->bSystem=1;
+ }
+
+ if(pSub_System_InitDllGlobalVariables=GetSubHash("_System_InitDllGlobalVariables",1)){
+ pSub_System_InitDllGlobalVariables->bUse=1;
+ pSub_System_InitDllGlobalVariables->bSystem=1;
+ }
+
+ if(pSub_System_InitStaticLocalVariables=GetSubHash("_System_InitStaticLocalVariables",1)){
+ pSub_System_InitStaticLocalVariables->bUse=1;
+ pSub_System_InitStaticLocalVariables->bSystem=1;
+ }
+
+ if(pSub_System_Call_Destructor_of_GlobalObject=GetSubHash("_System_Call_Destructor_of_GlobalObject",1)){
+ pSub_System_Call_Destructor_of_GlobalObject->bUse=1;
+ pSub_System_Call_Destructor_of_GlobalObject->bSystem=1;
+ }
+
+ if(pSub_System_GetSp=GetSubHash("_System_GetSp",1)){
+ pSub_System_GetSp->bUse=1;
+ pSub_System_GetSp->bSystem=1;
+ }
+
+ if(pSub_pow=GetSubHash("pow",1))
+ pSub_pow->bUse=1;
+
+ if(pSub_calloc=GetSubHash("calloc",1))
+ pSub_calloc->bUse=1;
+
+ if(pSub_realloc=GetSubHash("realloc",1))
+ pSub_realloc->bUse=1;
+
+ if(pSub_free=GetSubHash("free",1))
+ pSub_free->bUse=1;
+
+
+
+ //データテーブルスケジュール
+ pobj_DataTableSchedule=new CSchedule();
+ pobj_DataTableSchedule->SetFlag(SCHEDULE_FLAG_RELOC);
+
+ //インポートテーブルスケジュール
+ //※x64はRPI(実行中アドレス)からのオフセットになるため、再配置が不要
+ pobj_ImportAddrSchedule=new CImportAddrSchedule();
+
+ //プロシージャポインタスケジュール
+ pobj_SubAddrSchedule=new CSubAddrSchedule();
+
+ //グローバル変数アドレススケジュール
+ pobj_GlobalVarSchedule=new CSchedule();
+ pobj_GlobalVarSchedule->SetFlag(SCHEDULE_FLAG_RELOC);
+
+ //グローバル変数の初期バッファ
+ extern BYTE *initGlobalBuf;
+ initGlobalBuf=(BYTE *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+
+ //リロケーション情報
+ pobj_Reloc=new CReloc();
+
+ //一時スケジューリングポインタ
+ pobj_TempSchedule=new CTempSchedule();
+
+ obp_AllocSize=8192*2;
+ OpBuffer=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,obp_AllocSize);
+ obp=0;
+
+ //レジスタのブロッキングを管理するためのオブジェクトを生成
+ pobj_BlockReg=new CBlockReg;
+
+
+
+ //////////////////////
+ // グローバル実行領域
+ //////////////////////
+
+ cp=-1;
+ extern BOOL bCompilingGlobal;
+ bCompilingGlobal=1;
+
+ if(!bDll){
+ //ラベル用のメモリを確保
+ extern LABEL *pLabelNames;
+ extern int MaxLabelNum;
+ pLabelNames=(LABEL *)HeapAlloc(hHeap,0,1);
+ MaxLabelNum=0;
+
+ //Gotoラベルスケジュール
+ extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
+ extern int GotoLabelScheduleNum;
+ pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapAlloc(hHeap,0,1);
+ GotoLabelScheduleNum=0;
+
+ //With情報のメモリを確保
+ extern WITHINFO WithInfo;
+ WithInfo.ppName=(char **)HeapAlloc(hHeap,0,1);
+ WithInfo.pWithCp=(int *)HeapAlloc(hHeap,0,1);
+ WithInfo.num=0;
+
+ //Continueアドレスを初期化
+ extern DWORD dwContinueAddress;
+ dwContinueAddress=-1;
+
+ //スタックフレーム管理用クラスを初期化
+ extern CStackFrame *pobj_sf;
+ pobj_sf=new CStackFrame();
+
+
+ //未完成
+ //OpBuffer[obp++]=(char)0xCC;
+
+ //レキシカルスコープ情報を初期化
+ obj_LexScopes.Init(obp);
+
+ //sub rsp,スタックフレームサイズ
+ int StackFrameSchedule;
+ op_sub_rsp(0xFFFFFFFF);
+ StackFrameSchedule=obp-sizeof(long);
+
+ if(bDebugCompile){
+ //デバッグ用の変数を定義
+ DebugVariable();
+ }
+
+ //GC用の変数を定義
+ InitGCVariables();
+
+ //_System_StartupProgramの呼び出し
+ op_call(pSub_System_StartupProgram);
+
+ //クラスに属する静的メンバを定義
+ CMember::InitStaticMember();
+
+ //グローバル実行領域をコンパイル開始
+ CompileBuffer(0,0);
+
+ //ラベル用のメモリを解放
+ for(i=0;iGetFrameSize());
+
+ //xor rax,rax(raxを0に初期化する)
+ op_zero_reg(REG_RAX);
+
+ //ret
+ OpBuffer[obp++]=(char)0xC3;
+
+ //グローバル実行領域のコードサイズ
+ extern int GlobalOpBufferSize;
+ GlobalOpBufferSize=obp;
+
+ //スタックフレームスケジュール(subコマンドに渡す値)
+ *((long *)(OpBuffer+StackFrameSchedule))=pobj_sf->GetFrameSize();
+
+ //スタックフレームスケジュールを実行
+ pobj_sf->RunningSchedule();
+ delete pobj_sf;
+ pobj_sf=0;
+
+ //With情報のメモリを解放
+ for(i=0;ibUse==0){
+ pdi=pdi->pNextData;
+ continue;
+ }
+
+ //エラーチェック
+ HINSTANCE hLib;
+ hLib=LoadLibrary(pdi->file);
+ if(!hLib){
+ extern char OutputFileName[MAX_PATH];
+ char temp2[MAX_PATH],temp3[MAX_PATH];
+ _splitpath(OutputFileName,temp2,temp3,NULL,NULL);
+ lstrcat(temp2,temp3);
+ lstrcpy(temp3,pdi->file);
+ GetFullPath(temp3,temp2);
+ hLib=LoadLibrary(temp3);
+
+ if(!hLib){
+ SetError(-106,pdi->file,pdi->pos);
+ }
+ }
+
+ if(hLib){
+ if(!GetProcAddress(hLib,pdi->alias)){
+ FreeLibrary(hLib);
+ SetError(-107,pdi->alias,pdi->pos);
+ }
+ FreeLibrary(hLib);
+ }
+
+ pdi=pdi->pNextData;
+ }
+ }
+
+
+
+ /////////////////////////////
+ // リソースデータを読み込む
+ /////////////////////////////
+ extern char ResourceFileName[MAX_PATH];
+ GetResourceData(ResourceFileName);
+
+
+ //////////////////////////////
+ // エクスポート情報(DLLのみ)
+ //////////////////////////////
+ IMAGE_EXPORT_DIRECTORY ImageExportDirectory;
+ DWORD *lpdwExportAddressTable;
+ DWORD *lpdwExportNamePointerTable;
+ WORD *lpwExportOrdinalTable;
+ char lpExportNames[8192];
+ int ExportNamesLength;
+ int ExportNum;
+ int DllMain_EntryPoint;
+
+ DllMain_EntryPoint=-1;
+ ExportNum=0;
+ ExportNamesLength=0;
+ lpdwExportAddressTable=(DWORD *)HeapAlloc(hHeap,0,1);
+ lpdwExportNamePointerTable=(DWORD *)HeapAlloc(hHeap,0,1);
+ lpwExportOrdinalTable=(WORD *)HeapAlloc(hHeap,0,1);
+
+ if(bUse_ExportSection){
+ _splitpath(OutputFileName,NULL,NULL,lpExportNames,temporary);
+ lstrcat(lpExportNames,temporary);
+ ExportNamesLength=lstrlen(lpExportNames)+1;
+
+ extern SUBINFO **ppSubHash;
+ SUBINFO *psi,*psi2;
+ while(1){
+ //辞書順にサーチ
+ temporary[0]=0;
+ for(i=0,psi2=0;ibExport){
+ if(temporary[0]=='\0'){
+ lstrcpy(temporary,psi->name);
+ psi2=psi;
+ }
+ else{
+ i3=lstrlen(temporary);
+ i4=lstrlen(psi->name);
+ if(i3name,i3)>0){
+ lstrcpy(temporary,psi->name);
+ psi2=psi;
+ }
+ }
+ }
+ psi=psi->pNextData;
+ }
+ }
+ if(psi2==0) break;
+ psi=psi2;
+
+ psi->bExport=0;
+
+ if(lstrcmpi(psi->name,"DllMain")==0)
+ DllMain_EntryPoint=psi->CompileAddress;
+
+ lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD));
+ lpdwExportAddressTable[ExportNum]=psi->CompileAddress;
+
+ lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD));
+ lpdwExportNamePointerTable[ExportNum]=ExportNamesLength;
+
+ lpwExportOrdinalTable=(WORD *)HeapReAlloc(hHeap,0,lpwExportOrdinalTable,(ExportNum+1)*sizeof(WORD));
+ lpwExportOrdinalTable[ExportNum]=ExportNum;
+
+ lstrcpy(lpExportNames+ExportNamesLength,psi->name);
+ ExportNamesLength+=lstrlen(lpExportNames+ExportNamesLength)+1;
+
+ ExportNum++;
+ }
+ for(i=0;idwType==DECLARE_STATIC||
+ pdi->bUse==0){
+ pdi=pdi->pNextData;
+ continue;
+ }
+
+ if(lstrlen(pdi->file)>16){
+ SetError(7,NULL,cp);
+ break;
+ }
+ for(i2=0;i2file)==0) break;
+ }
+ if(i2==ImportDllNum){
+ ppDllNames=(char **)HeapReAlloc(hHeap,0,ppDllNames,(ImportDllNum+1)*sizeof(char **));
+ ppDllNames[ImportDllNum]=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,16);
+ lstrcpy(ppDllNames[ImportDllNum],pdi->file);
+ ImportDllNum++;
+ }
+
+ pdi=pdi->pNextData;
+ }
+ }
+
+ //IMAGE_IMPORT_DESCRIPTOR、及びルックアップ テーブル サイズの計算
+ IMAGE_IMPORT_DESCRIPTOR *pImportDescriptor;
+ int LookupSize;
+ LookupSize=0;
+ pImportDescriptor=(IMAGE_IMPORT_DESCRIPTOR *)HeapAlloc(hHeap,0,(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR));
+ for(i=0;idwType==DECLARE_STATIC||
+ pdi->bUse==0){
+ pdi=pdi->pNextData;
+ continue;
+ }
+
+ if(lstrcmp(ppDllNames[i],pdi->file)==0){
+ //ルックアップデータのサイズを追加
+ LookupSize+=sizeof(_int64);
+ }
+
+ pdi=pdi->pNextData;
+ }
+ }
+ LookupSize+=sizeof(_int64); //NULL用
+ }
+ memset(&pImportDescriptor[i],0,sizeof(IMAGE_IMPORT_DESCRIPTOR));
+ for(i=0;idwType==DECLARE_STATIC||
+ pdi->bUse==0){
+ pdi=pdi->pNextData;
+ continue;
+ }
+
+ if(lstrcmp(ppDllNames[i],pdi->file)==0){
+ //ルックアップの位置をセット(後にインポート アドレス テーブルにセットしなおされる)
+ pdi->LookupAddress=i5*sizeof(_int64);
+
+ //ルックアップ テーブルの値をセット
+ pLookupTable[i5++]=
+ LookupSize+ //インポート アドレス テーブル
+ LookupSize+ //ルックアップテーブル
+ (ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+ //IMAGE_IMPORT_DESCRIPTOR
+ ImportDllNum*0x10+ //DLL名の羅列
+ HintSize; //ヒント名へのオフセット
+
+ //ヒント テーブル
+ pHintTable[HintSize++]=0;
+ pHintTable[HintSize++]=0;
+ lstrcpy(pHintTable+HintSize,pdi->alias);
+ i4=lstrlen(pdi->alias);
+ HintSize+=i4+1;
+ if(i4%2==0) pHintTable[HintSize++]=0;
+
+ if(HintAllocSizepNextData;
+ }
+ }
+ pLookupTable[i5++]=0;
+ }
+
+
+ if(bDll){
+ //DLLの場合はリロケーション情報を仮生成
+ //※正式な生成は各セクションのメモリ上のサイズが決定してから再度行う。
+ pobj_Reloc->ResetRelocBuffer();
+ }
+
+
+
+ //グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
+ //(デバッグ情報で利用される)
+ extern int MaxGlobalVarNum;
+ extern VARIABLE *GlobalVar;
+ extern int AllInitGlobalVarSize;
+ for(i=0;imake();
+ }
+
+
+
+ /////////////////////////////////////
+ // 各セクションの位置とサイズを計算
+ /////////////////////////////////////
+
+ //コードセッションのファイル上のサイズ
+ if(obp%FILE_ALIGNMENT) FileSize_CodeSection=obp+(FILE_ALIGNMENT-obp%FILE_ALIGNMENT);
+ else FileSize_CodeSection=obp;
+ if(FileSize_CodeSection) bUse_CodeSection=1;
+ else bUse_CodeSection=0;
+
+ //エクスポートセクションのファイル上のサイズ
+ i= sizeof(IMAGE_EXPORT_DIRECTORY)+ //エクスポートディレクトリテーブルを飛び越す
+ ExportNum*sizeof(DWORD)+ //エクスポート アドレス テーブルを飛び越す
+ ExportNum*sizeof(DWORD)+ //エクスポート名ポインタ テーブルを飛び越す
+ ExportNum*sizeof(WORD)+ //エクスポート序数テーブルを飛び越す
+ ExportNamesLength; //シンボル名バッファ
+ if(bUse_ExportSection){
+ if(i%FILE_ALIGNMENT) FileSize_ExportSection=i+(FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+ else FileSize_ExportSection=i;
+ }
+ else FileSize_ExportSection=0;
+
+ //インポートセクションのファイル上のサイズ
+ i=
+ LookupSize+ //インポート アドレス テーブル
+ LookupSize+ //ルックアップテーブル
+ (ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+ //IMAGE_IMPORT_DESCRIPTOR
+ ImportDllNum*0x10+ //DLL名の羅列
+ HintSize; //ヒント名
+ if(i%FILE_ALIGNMENT) FileSize_ImportSection=i+(FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+ else FileSize_ImportSection=i;
+ bUse_ImportSection=1; //インポートセクションは必ず存在する
+
+ //データセクションのファイル上のサイズ
+ if(DataTableSize%FILE_ALIGNMENT) FileSize_DataSection=DataTableSize+(FILE_ALIGNMENT-DataTableSize%FILE_ALIGNMENT);
+ else FileSize_DataSection=DataTableSize;
+ if(FileSize_DataSection) bUse_DataSection=1;
+ else bUse_DataSection=0;
+
+ //リライタブルセクションのファイル上のサイズ(グローバル変数の初期情報のみを格納)
+ extern int AllInitGlobalVarSize;
+ if(AllInitGlobalVarSize%FILE_ALIGNMENT) FileSize_RWSection=AllInitGlobalVarSize+(FILE_ALIGNMENT-AllInitGlobalVarSize%FILE_ALIGNMENT);
+ else{
+ if(AllInitGlobalVarSize) FileSize_RWSection=AllInitGlobalVarSize;
+ else FileSize_RWSection=FILE_ALIGNMENT;
+ }
+ bUse_RWSection=1;
+
+ //リソースセクションのファイル上のサイズ
+ char *RSrcSectionBuffer;
+ int RSrcSectionSize;
+ RSrcSectionBuffer=GetRSrcSectionBuffer(&RSrcSectionSize);
+ if(RSrcSectionSize%FILE_ALIGNMENT) FileSize_RSrcSection=RSrcSectionSize+(FILE_ALIGNMENT-RSrcSectionSize%FILE_ALIGNMENT);
+ else FileSize_RSrcSection=RSrcSectionSize;
+ if(FileSize_RSrcSection) bUse_RSrcSection=1;
+ else bUse_RSrcSection=0;
+
+ //リロケーションセクションのファイル上のサイズ
+ if(pobj_Reloc->length%FILE_ALIGNMENT) FileSize_RelocSection=pobj_Reloc->length+(FILE_ALIGNMENT-pobj_Reloc->length%FILE_ALIGNMENT);
+ else FileSize_RelocSection=pobj_Reloc->length;
+ if(FileSize_RelocSection) bUse_RelocSection=1;
+ else bUse_RelocSection=0;
+
+ //デバッグセクションのファイル上のサイズ
+ if(pobj_DebugSection->length%FILE_ALIGNMENT) FileSize_DebugSection=pobj_DebugSection->length+(FILE_ALIGNMENT-pobj_DebugSection->length%FILE_ALIGNMENT);
+ else FileSize_DebugSection=pobj_DebugSection->length;
+ if(FileSize_DebugSection) bUse_DebugSection=1;
+ else bUse_DebugSection=0;
+
+
+ //各セッションのファイル上の位置
+ FilePos_CodeSection= EXE_HEADER_SIZE;
+ FilePos_ExportSection= FilePos_CodeSection+
+ FileSize_CodeSection;
+ FilePos_ImportSection= FilePos_ExportSection+
+ FileSize_ExportSection;
+ FilePos_DataSection= FilePos_ImportSection+
+ FileSize_ImportSection;
+ FilePos_RWSection= FilePos_DataSection+
+ FileSize_DataSection;
+ FilePos_RSrcSection= FilePos_RWSection+
+ FileSize_RWSection;
+ FilePos_RelocSection= FilePos_RSrcSection+
+ FileSize_RSrcSection;
+ FilePos_DebugSection= FilePos_RelocSection+
+ FileSize_RelocSection;
+
+ //コードセッションのメモリ上のサイズ
+ if(FileSize_CodeSection%MEM_ALIGNMENT) MemSize_CodeSection=FileSize_CodeSection+(MEM_ALIGNMENT-FileSize_CodeSection%MEM_ALIGNMENT);
+ else MemSize_CodeSection=FileSize_CodeSection;
+
+ //エクスポートセクションのメモリ上のサイズ
+ if(FileSize_ExportSection%MEM_ALIGNMENT) MemSize_ExportSection=FileSize_ExportSection+(MEM_ALIGNMENT-FileSize_ExportSection%MEM_ALIGNMENT);
+ else MemSize_ExportSection=FileSize_ExportSection;
+
+ //インポートセクションのメモリ上のサイズ
+ if(FileSize_ImportSection%MEM_ALIGNMENT) MemSize_ImportSection=FileSize_ImportSection+(MEM_ALIGNMENT-FileSize_ImportSection%MEM_ALIGNMENT);
+ else MemSize_ImportSection=FileSize_ImportSection;
+
+ //データセクションのメモリ上のサイズ
+ if(FileSize_DataSection%MEM_ALIGNMENT) MemSize_DataSection=FileSize_DataSection+(MEM_ALIGNMENT-FileSize_DataSection%MEM_ALIGNMENT);
+ else MemSize_DataSection=FileSize_DataSection;
+
+ //リライタブルセクションのメモリ上のサイズ
+ extern int AllGlobalVarSize;
+ i=AllInitGlobalVarSize+AllGlobalVarSize;
+ if(i%MEM_ALIGNMENT) MemSize_RWSection=i+(MEM_ALIGNMENT-i%MEM_ALIGNMENT);
+ else MemSize_RWSection=i;
+
+ //リソースセクションのメモリ上のサイズ
+ if(FileSize_RSrcSection%MEM_ALIGNMENT) MemSize_RSrcSection=FileSize_RSrcSection+(MEM_ALIGNMENT-FileSize_RSrcSection%MEM_ALIGNMENT);
+ else MemSize_RSrcSection=FileSize_RSrcSection;
+
+ //リロケーションセクションのメモリ上のサイズ
+ if(FileSize_RelocSection%MEM_ALIGNMENT) MemSize_RelocSection=FileSize_RelocSection+(MEM_ALIGNMENT-FileSize_RelocSection%MEM_ALIGNMENT);
+ else MemSize_RelocSection=FileSize_RelocSection;
+
+ //デバッグセクションのメモリ上のサイズ
+ if(FileSize_DebugSection%MEM_ALIGNMENT) MemSize_DebugSection=FileSize_DebugSection+(MEM_ALIGNMENT-FileSize_DebugSection%MEM_ALIGNMENT);
+ else MemSize_DebugSection=FileSize_DebugSection;
+
+
+ //各セッションのメモリ上の位置
+ if(bUse_ExportSection) MemPos_ExportSection= 0x1000+
+ MemSize_CodeSection;
+ else MemPos_ExportSection=0;
+ if(bUse_ImportSection) MemPos_ImportSection= 0x1000+
+ MemSize_CodeSection+
+ MemSize_ExportSection;
+ else MemPos_ImportSection=0;
+ if(bUse_DataSection) MemPos_DataSection= 0x1000+
+ MemSize_CodeSection+
+ MemSize_ExportSection+
+ MemSize_ImportSection;
+ else MemPos_DataSection=0;
+ if(bUse_RWSection) MemPos_RWSection= 0x1000+
+ MemSize_CodeSection+
+ MemSize_ExportSection+
+ MemSize_ImportSection+
+ MemSize_DataSection;
+ else MemPos_RWSection=0;
+ if(bUse_RSrcSection) MemPos_RSrcSection= 0x1000+
+ MemSize_CodeSection+
+ MemSize_ExportSection+
+ MemSize_ImportSection+
+ MemSize_DataSection+
+ MemSize_RWSection;
+ else MemPos_RSrcSection=0;
+ if(bUse_RelocSection) MemPos_RelocSection= 0x1000+
+ MemSize_CodeSection+
+ MemSize_ExportSection+
+ MemSize_ImportSection+
+ MemSize_DataSection+
+ MemSize_RWSection+
+ MemSize_RSrcSection;
+ else MemPos_RelocSection=0;
+ if(bUse_DebugSection) MemPos_DebugSection= 0x1000+
+ MemSize_CodeSection+
+ MemSize_ExportSection+
+ MemSize_ImportSection+
+ MemSize_DataSection+
+ MemSize_RWSection+
+ MemSize_RSrcSection+
+ MemSize_RelocSection;
+ else MemPos_DebugSection=0;
+
+
+
+ /////////////////////////////
+ // GC用の変数スケジュール
+ /////////////////////////////
+ PerformedGcVarSchedule();
+
+
+ ////////////////////////////
+ // エクスポート情報の再配置
+ ////////////////////////////
+ if(bUse_ExportSection){
+ for(i=0;ibUse==0){
+ pdi=pdi->pNextData;
+ continue;
+ }
+
+ if(lstrcmp(ppDllNames[i],pdi->file)==0){
+ //ルックアップ テーブル
+ pLookupTable[i5++]+=MemPos_ImportSection;
+ }
+
+ pdi=pdi->pNextData;
+ }
+ }
+ i5++;
+ }
+
+
+ ////////////////////////////////////////
+ //仮想関数データテーブルスケジュール
+ pobj_DBClass->ActionVtblSchedule(ImageBase,MemPos_CodeSection);
+
+
+ //////////////////////////////
+ // データテーブルスケジュール
+ for(i=0;inum;i++){
+ *((long *)(OpBuffer+pobj_DataTableSchedule->pObpValues[i]))+=ImageBase+MemPos_DataSection;
+ }
+ delete pobj_DataTableSchedule;
+
+
+ //////////////////////////////////
+ // インポートテーブルスケジュール(インポート アドレス テーブルを指し示させる)
+ // ※x86はRVAからのオフセット。x64はRPI(実行中アドレス)からのオフセット
+ for(i=0;inum;i++){
+ DECLAREINFO *pdi;
+ pdi=pobj_ImportAddrSchedule->ppdi[i];
+ *((long *)(OpBuffer+pobj_ImportAddrSchedule->pObpValues[i]))=
+ MemPos_ImportSection+
+ pdi->LookupAddress
+ -(MemPos_CodeSection+pobj_ImportAddrSchedule->pObpValues[i]+sizeof(long));
+ }
+ delete pobj_ImportAddrSchedule;
+
+
+ ////////////////////////////////////
+ // プロシージャポインタスケジュール
+ for(i=0;inum;i++){
+ if(pobj_SubAddrSchedule->pbCall[i]){
+ *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
+ pobj_SubAddrSchedule->ppsi[i]->CompileAddress-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));
+ }
+ else{
+ *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
+ pobj_SubAddrSchedule->ppsi[i]->CompileAddress+ImageBase+MemPos_CodeSection;
+ }
+ }
+ delete pobj_SubAddrSchedule;
+
+
+ if(bDll){
+ //DLLの場合はリロケーション情報を生成
+ pobj_Reloc->ResetRelocBuffer();
+ }
+
+ delete pobj_TempSchedule;
+
+
+
+ //////////////////////////////////////
+ // グローバル変数アドレススケジュール
+ //////////////////////////////////////
+
+ /*
+ GlobalArea1 - 初期バッファあり
+ GlobalArea2 - 初期バッファなし
+ */
+ for(i=0;inum;i++){
+ if(*((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i])) & 0x80000000){
+ //初期バッファなし
+ *((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i]))=
+ AllInitGlobalVarSize+
+ (*((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i])) & 0x7FFFFFFF)+
+ ImageBase+MemPos_RWSection;
+ }
+ else{
+ //初期バッファあり
+ *((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i]))+=
+ ImageBase+MemPos_RWSection;
+ }
+ }
+ delete pobj_GlobalVarSchedule;
+
+ //グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
+ //(デバッグ情報で利用される)
+ extern int MaxGlobalVarNum;
+ extern VARIABLE *GlobalVar;
+ for(i=0;ilength;
+ ImagePeHdr.OptionalHeader.DataDirectory[6].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[6].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[7].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[7].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[8].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[8].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[9].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[9].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[10].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[10].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[11].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[11].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[12].VirtualAddress=MemPos_ImportSection;//インポート アドレス テーブル
+ ImagePeHdr.OptionalHeader.DataDirectory[12].Size=LookupSize;
+ ImagePeHdr.OptionalHeader.DataDirectory[13].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[13].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[14].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[14].Size=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[15].VirtualAddress=0;
+ ImagePeHdr.OptionalHeader.DataDirectory[15].Size=0;
+
+
+ //コードセクションヘッダ
+ IMAGE_SECTION_HEADER CodeSectionHeader;
+ memset((char *)CodeSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)CodeSectionHeader.Name,".text");
+ CodeSectionHeader.Misc.VirtualSize= obp;
+ CodeSectionHeader.VirtualAddress= MemPos_CodeSection; //開始アドレス
+ CodeSectionHeader.SizeOfRawData= FileSize_CodeSection;
+ CodeSectionHeader.PointerToRawData= FilePos_CodeSection; //ファイル上の開始アドレス
+ CodeSectionHeader.PointerToRelocations= 0;
+ CodeSectionHeader.PointerToLinenumbers= 0;
+ CodeSectionHeader.NumberOfRelocations= 0;
+ CodeSectionHeader.NumberOfLinenumbers= 0;
+ CodeSectionHeader.Characteristics= IMAGE_SCN_MEM_EXECUTE|
+ IMAGE_SCN_MEM_READ|
+ IMAGE_SCN_CNT_CODE;
+
+ //エクスポートセクションヘッダ
+ IMAGE_SECTION_HEADER ExportSectionHeader;
+ memset((char *)ExportSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)ExportSectionHeader.Name,".edata");
+ ExportSectionHeader.Misc.VirtualSize= MemSize_ExportSection;
+ ExportSectionHeader.VirtualAddress= MemPos_ExportSection; //開始アドレス
+ ExportSectionHeader.SizeOfRawData= FileSize_ExportSection; //サイズ
+ ExportSectionHeader.PointerToRawData= FilePos_ExportSection; //ファイル上の開始アドレス
+ ExportSectionHeader.PointerToRelocations= 0;
+ ExportSectionHeader.PointerToLinenumbers= 0;
+ ExportSectionHeader.NumberOfRelocations= 0;
+ ExportSectionHeader.NumberOfLinenumbers= 0;
+ ExportSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
+ IMAGE_SCN_MEM_READ;
+
+ //インポートセクションヘッダ
+ IMAGE_SECTION_HEADER ImportSectionHeader;
+ memset((char *)ImportSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)ImportSectionHeader.Name,".idata");
+ ImportSectionHeader.Misc.VirtualSize=
+ LookupSize+ //インポートアドレステーブル
+ LookupSize+ //ルックアップテーブル
+ (ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+
+ 16*ImportDllNum+ //DLL名
+ HintSize; //ヒント名(関数名)テーブル
+ ImportSectionHeader.VirtualAddress= MemPos_ImportSection; //開始アドレス
+ ImportSectionHeader.SizeOfRawData= FileSize_ImportSection; //サイズ
+ ImportSectionHeader.PointerToRawData= FilePos_ImportSection; //ファイル上の開始アドレス
+ ImportSectionHeader.PointerToRelocations= 0;
+ ImportSectionHeader.PointerToLinenumbers= 0;
+ ImportSectionHeader.NumberOfRelocations= 0;
+ ImportSectionHeader.NumberOfLinenumbers= 0;
+ ImportSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
+ IMAGE_SCN_MEM_READ;
+
+ //データセクションヘッダ
+ IMAGE_SECTION_HEADER DataSectionHeader;
+ memset((char *)DataSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)DataSectionHeader.Name,".sdata");
+ DataSectionHeader.Misc.VirtualSize= MemSize_DataSection;
+ DataSectionHeader.VirtualAddress= MemPos_DataSection;
+ DataSectionHeader.SizeOfRawData= FileSize_DataSection;
+ DataSectionHeader.PointerToRawData= FilePos_DataSection;
+ DataSectionHeader.PointerToRelocations= 0;
+ DataSectionHeader.PointerToLinenumbers= 0;
+ DataSectionHeader.NumberOfRelocations= 0;
+ DataSectionHeader.NumberOfLinenumbers= 0;
+ DataSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
+ IMAGE_SCN_MEM_READ|
+ IMAGE_SCN_MEM_WRITE;
+
+ //リライタブルセクションヘッダ
+ IMAGE_SECTION_HEADER RWSectionHeader;
+ memset((char *)RWSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)RWSectionHeader.Name,".data");
+ RWSectionHeader.Misc.VirtualSize= AllInitGlobalVarSize+AllGlobalVarSize;
+ RWSectionHeader.VirtualAddress= MemPos_RWSection;
+ RWSectionHeader.SizeOfRawData= FileSize_RWSection;
+ RWSectionHeader.PointerToRawData= FilePos_RWSection;
+ RWSectionHeader.PointerToRelocations= 0;
+ RWSectionHeader.PointerToLinenumbers= 0;
+ RWSectionHeader.NumberOfRelocations= 0;
+ RWSectionHeader.NumberOfLinenumbers= 0;
+ RWSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
+ IMAGE_SCN_MEM_READ|
+ IMAGE_SCN_MEM_WRITE;
+
+ //リソースセクションヘッダ
+ IMAGE_SECTION_HEADER RSrcSectionHeader;
+ memset((char *)RSrcSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)RSrcSectionHeader.Name,".rsrc");
+ RSrcSectionHeader.Misc.VirtualSize= RSrcSectionSize;
+ RSrcSectionHeader.VirtualAddress= MemPos_RSrcSection;
+ RSrcSectionHeader.SizeOfRawData= FileSize_RSrcSection;
+ RSrcSectionHeader.PointerToRawData= FilePos_RSrcSection;
+ RSrcSectionHeader.PointerToRelocations= 0;
+ RSrcSectionHeader.PointerToLinenumbers= 0;
+ RSrcSectionHeader.NumberOfRelocations= 0;
+ RSrcSectionHeader.NumberOfLinenumbers= 0;
+ RSrcSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
+ IMAGE_SCN_MEM_READ;
+
+ //リロケーションセクションヘッダ
+ IMAGE_SECTION_HEADER RelocSectionHeader;
+ memset((char *)RelocSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)RelocSectionHeader.Name,".reloc");
+ RelocSectionHeader.Misc.VirtualSize= pobj_Reloc->length;
+ RelocSectionHeader.VirtualAddress= MemPos_RelocSection; //開始アドレス
+ RelocSectionHeader.SizeOfRawData= FileSize_RelocSection; //サイズ
+ RelocSectionHeader.PointerToRawData= FilePos_RelocSection; //ファイル上の開始アドレス
+ RelocSectionHeader.PointerToRelocations= 0;
+ RelocSectionHeader.PointerToLinenumbers= 0;
+ RelocSectionHeader.NumberOfRelocations= 0;
+ RelocSectionHeader.NumberOfLinenumbers= 0;
+ RelocSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
+ IMAGE_SCN_MEM_DISCARDABLE|
+ IMAGE_SCN_MEM_READ;
+
+ //デバッグセクションヘッダ
+ IMAGE_SECTION_HEADER DebugSectionHeader;
+ memset((char *)DebugSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+ lstrcpy((char *)DebugSectionHeader.Name,".debug");
+ DebugSectionHeader.Misc.VirtualSize= pobj_DebugSection->length;
+ DebugSectionHeader.VirtualAddress= MemPos_DebugSection; //開始アドレス
+ DebugSectionHeader.SizeOfRawData= FileSize_DebugSection; //サイズ
+ DebugSectionHeader.PointerToRawData= FilePos_DebugSection; //ファイル上の開始アドレス
+ DebugSectionHeader.PointerToRelocations= 0;
+ DebugSectionHeader.PointerToLinenumbers= 0;
+ DebugSectionHeader.NumberOfRelocations= 0;
+ DebugSectionHeader.NumberOfLinenumbers= 0;
+ DebugSectionHeader.Characteristics= IMAGE_SCN_MEM_DISCARDABLE|
+ IMAGE_SCN_MEM_READ;
+
+
+ hFile=CreateFile(OutputFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
+ if(hFile==INVALID_HANDLE_VALUE){
+ SetError(53,OutputFileName,-1);
+ goto EndWriteOpcode;
+ }
+
+ //ヘッダ
+ WriteFile(hFile,(void *)&ImageDosHeader,sizeof(IMAGE_DOS_HEADER),(DWORD *)&i2,NULL);
+ i=i2;
+
+ //Dosスタブ
+ WriteFile(hFile,DosStubBuffer,DosStubSize,(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //0x0100までNULLを並べる
+ temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,0x0100-i);
+ WriteFile(hFile,temp2,0x0100-i,(DWORD *)&i2,NULL);
+ HeapDefaultFree(temp2);
+ i+=i2;
+
+ //PEヘッダ
+ WriteFile(hFile,&ImagePeHdr,sizeof(IMAGE_NT_HEADERS64),(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //コード セクション ヘッダ
+ WriteFile(hFile,&CodeSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+
+ if(bUse_ExportSection){
+ //エクスポート セクション ヘッダ
+ WriteFile(hFile,&ExportSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+ if(bUse_ImportSection){
+ //インポート セクション ヘッダ
+ WriteFile(hFile,&ImportSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+ if(bUse_DataSection){
+ //データ セクション ヘッダ
+ WriteFile(hFile,&DataSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+ if(bUse_RWSection){
+ //リライタブルセクションヘッダ
+ WriteFile(hFile,&RWSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+ if(bUse_RSrcSection){
+ //リソースセクションヘッダ
+ WriteFile(hFile,&RSrcSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+ if(bUse_RelocSection){
+ //リロケーションセクションヘッダ
+ WriteFile(hFile,&RelocSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+ if(bUse_DebugSection){
+ //デバッグセクションヘッダ
+ WriteFile(hFile,&DebugSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+
+ //EXE_HEADER_SIZEまでNULLを並べる
+ temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,EXE_HEADER_SIZE-i);
+ WriteFile(hFile,temp2,EXE_HEADER_SIZE-i,(DWORD *)&i2,NULL);
+ HeapDefaultFree(temp2);
+ i+=i2;
+
+ //コード
+ WriteFile(hFile,OpBuffer,obp,(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //FilePos_ExportSectionまでNULLを並べる
+ temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_ExportSection-i);
+ WriteFile(hFile,temp2,FilePos_ExportSection-i,(DWORD *)&i2,NULL);
+ HeapDefaultFree(temp2);
+ i+=i2;
+
+ if(bUse_ExportSection){
+ //エクスポート ディレクトリ テーブル
+ WriteFile(hFile,&ImageExportDirectory,sizeof(IMAGE_EXPORT_DIRECTORY),(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //エクスポート アドレス テーブル
+ WriteFile(hFile,lpdwExportAddressTable,ExportNum*sizeof(DWORD),(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //エクスポート名ポインタ テーブル
+ WriteFile(hFile,lpdwExportNamePointerTable,ExportNum*sizeof(DWORD),(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //エクスポート序数テーブル
+ WriteFile(hFile,lpwExportOrdinalTable,ExportNum*sizeof(WORD),(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //シンボル名
+ WriteFile(hFile,lpExportNames,ExportNamesLength,(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+
+ //FilePos_ImportSectionまでNULLを並べる
+ temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_ImportSection-i);
+ WriteFile(hFile,temp2,FilePos_ImportSection-i,(DWORD *)&i2,NULL);
+ HeapDefaultFree(temp2);
+ i+=i2;
+
+ if(bUse_ImportSection){
+ //インポート アドレス テーブル
+ WriteFile(hFile,pLookupTable,LookupSize,(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //ルックアップ テーブル
+ WriteFile(hFile,pLookupTable,LookupSize,(DWORD *)&i2,NULL);
+ i+=i2;
+
+ //インポート ディレクトリ テーブル(Nullディレクトリ テーブルを含む)
+ for(i3=0;i3<(ImportDllNum+1);i3++){
+ WriteFile(hFile,&pImportDescriptor[i3],sizeof(IMAGE_IMPORT_DESCRIPTOR),(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+
+ //DLL名
+ for(i3=0;i3buffer,pobj_Reloc->length,(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+
+ //ファイルアラインメントを考慮
+ if(i%FILE_ALIGNMENT){
+ temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+ WriteFile(hFile,temp2,FILE_ALIGNMENT-i%FILE_ALIGNMENT,(DWORD *)&i2,NULL);
+ HeapDefaultFree(temp2);
+ i+=i2;
+ }
+
+ if(bUse_DebugSection){
+ //デバッグセクション
+ WriteFile(hFile,pobj_DebugSection->buffer,pobj_DebugSection->length,(DWORD *)&i2,NULL);
+ i+=i2;
+ }
+
+ //ファイルアラインメントを考慮
+ if(i%FILE_ALIGNMENT){
+ temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+ WriteFile(hFile,temp2,FILE_ALIGNMENT-i%FILE_ALIGNMENT,(DWORD *)&i2,NULL);
+ HeapDefaultFree(temp2);
+ i+=i2;
+ }
+
+ //書き込み終了
+ CloseHandle(hFile);
+
+
+EndWriteOpcode:
+
+ //Dosスタブ用のメモリを解放
+ HeapDefaultFree(DosStubBuffer);
+
+ //エクスポート テーブル情報を解放
+ HeapDefaultFree(lpdwExportAddressTable);
+ HeapDefaultFree(lpdwExportNamePointerTable);
+ HeapDefaultFree(lpwExportOrdinalTable);
+
+ //インポートDLL情報を解放
+ HeapDefaultFree(pImportDescriptor);
+ for(i=0;ipush(REG_R11);
+
+ //mov rcx,rax
+ op_mov_RR(REG_RCX,REG_RAX);
+
+ //call constructor
+ op_call(pobj_StringClass->ppobj_Method[pobj_StringClass->ConstructorMemberSubIndex]->psi);
+
+ int i2;
+ i2=AddDataTable(lpszText,lstrlen(lpszText));
+
+ //mov rax,i2
+ op_mov_RV(sizeof(_int64),REG_RAX,i2);
+ obp-=sizeof(long);
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+
+
+ //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->ref(REG_R11);
+
+
+ RELATIVE_VAR RelativeVar;
+ RelativeVar.bOffsetOffset=0;
+ RelativeVar.offset=0;
+ RelativeVar.dwKind=VAR_DIRECTMEM;
+
+ SetObjectVariableFromRax((LONG_PTR)pobj_StringClass,DEF_PTR_BYTE,-1,&RelativeVar,0);
+
+ //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R11);
+
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+
+ //mov reg,r11
+ op_mov_RR(reg,REG_R11);
+}
+
+void SetUseRegFromRax(int type,int UseReg,int XmmReg){
+ if(IsRealNumberType(type)){
+ //実数型
+ if(XmmReg==REG_XMM4){
+ if(type==DEF_DOUBLE){
+ //movsd qword ptr[rsp+offset],xmm0 ※スタックフレームを利用
+ pobj_sf->push(REG_XMM0,sizeof(double));
+ }
+ if(type==DEF_SINGLE){
+ //movss dword ptr[rsp+offset],xmm0 ※スタックフレームを利用
+ pobj_sf->push(REG_XMM0,sizeof(float));
+ }
+ }
+ else{
+ if(type==DEF_DOUBLE){
+ //movsd xmm_reg,xmm0
+ op_movsd_RR(XmmReg,REG_XMM0);
+ }
+ else if(type==DEF_SINGLE){
+ //movss xmm_reg,xmm0
+ op_movss_RR(XmmReg,REG_XMM0);
+ }
+ }
+ }
+ else{
+ //整数型
+ if(UseReg==REG_R14){
+ //mov qword ptr[rsp+offset],rax ※スタックフレームを利用
+ pobj_sf->push(REG_RAX);
+ }
+ else{
+ //mov reg,rax
+ op_mov64_ToReg_FromReg(UseReg,REG_RAX);
+ }
+ }
+}
+
+int NumOpe(int *pReg,char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap){
+ extern HANDLE hHeap;
+ int i,i2,i3,i4;
+ char temporary[1024],temp2[1024],temp3[1024];
+
+ if(Command[0]=='\0'){
+ SetError(1,NULL,cp);
+ return 0;
+ }
+
+ if(Command[0]==1&&Command[1]==ESC_NEW){
+ //New演算子(オブジェクト生成)
+ return Operator_New(Command+2,plpIndex);
+ }
+
+
+ /////////////////////////////////
+ // 式要素を逆ポーランド式で取得
+ /////////////////////////////////
+
+ char *values[255];
+ long calc[255];
+ long stack[255];
+ int pnum;
+ if(!GetNumOpeElements(Command,&pnum,values,calc,stack)){
+ for(i=0;inum;
+
+ //リテラル演算の場合を考慮した演算前のデータテーブルスケジュール位置
+ int Before_DataTableScheduleNum;
+ Before_DataTableScheduleNum=pobj_DataTableSchedule->num;
+
+ //リテラル演算の場合を考慮した演算前の再配置スケジュール
+ CReloc *pobj_BackReloc;
+ pobj_BackReloc=new CReloc();
+ pobj_BackReloc->copy(pobj_Reloc);
+
+ //リテラル演算の場合を考慮した演算前のスタックフレームスケジュール位置
+ int Before_StackFrameScheduleNum;
+ Before_StackFrameScheduleNum=pobj_sf->num;
+
+ double dbl;
+ int sp;
+ int type[255];
+ LONG_PTR index_stack[255];
+ BOOL bUseHeap[255];
+ _int64 i64data;
+ int UseReg,XmmReg;
+ BOOL bXmm;
+ for(i=0,sp=0;iGetNextReg();
+ XmmReg=pobj_reg->GetNextXmmReg();
+
+ bXmm=0;
+
+ char *term;
+ term=values[i];
+
+ if(term[0]=='\"'){
+ //リテラル文字列
+ if(!RemoveStringQuotes(term)){
+ SetError(43,NULL,cp);
+ goto error;
+ }
+ i3=lstrlen(term);
+StrLiteral:
+
+ if(BaseType==DEF_OBJECT){
+ CClass *pobj_Class;
+ pobj_Class=(CClass *)lpBaseIndex;
+ if(IsStringSubsituation(pobj_Class)){
+ //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合
+
+ //String型オブジェクトを生成
+ NewStringObject(UseReg,term);
+
+ extern CClass *pobj_StringClass;
+ type[sp]=DEF_OBJECT;
+ index_stack[sp]=(LONG_PTR)pobj_StringClass;
+ bUseHeap[sp]=1;
+ bLiteralCalculation=0;
+
+ if(bXmm) pobj_reg->LockXmmReg();
+ else pobj_reg->LockReg();
+
+ sp++;
+ break;
+ }
+ }
+
+ type[sp]=DEF_PTR_BYTE;
+ bLiteralCalculation=0;
+
+ i2=AddDataTable(term,i3);
+
+ //mov reg,i2
+ op_mov_RV(sizeof(_int64),UseReg,i2);
+ obp-=sizeof(long);
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+
+ if(UseReg==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+ }
+ else if((term[0]=='e'||term[0]=='E')&&
+ (term[1]=='x'||term[1]=='X')&&
+ term[2]=='\"'){
+ //拡張版リテラル文字列(エスケープシーケンス可能)
+ if(!RemoveStringQuotes(term+2)){
+ SetError(43,NULL,cp);
+ goto error;
+ }
+ i3=FormatString_EscapeSequence(term+2);
+ term+=2;
+
+ goto StrLiteral;
+ }
+ else if(IsVariableTopChar(term[0])||
+ term[0]=='*'||
+ (term[0]=='.'&&IsVariableTopChar(term[1]))){
+ //////////////////
+ // 何らかの識別子
+
+ //////////////////////////////////////
+ // 関数(DLL、ユーザー定義、組み込み)
+ //////////////////////////////////////
+
+ i2=GetCallProcName(term,temporary);
+ if(term[i2]=='('){
+ i4=GetStringInPare_RemovePare(temp2,term+i2+1);
+
+ int idProc;
+ void *pInfo;
+ idProc=GetProc(temporary,&pInfo);
+
+ if(idProc){
+ //閉じカッコ")"に続く文字がNULLでないときはエラーにする
+ if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
+
+
+ //////////////////////////////////////////////////////
+ ///// レジスタ資源のバックアップ
+ { BACKUP_REGISTER_RESOURCE
+ //////////////////////////////////////////////////////
+
+
+ ////////////////
+ // 呼び出し
+ ////////////////
+
+ i2=CallProc(idProc,pInfo,temporary,temp2,&index_stack[sp]);
+ if(i2==-1){
+ //戻り値が存在しないとき
+ for(i2=2;;i2++){
+ if(term[i2]=='('||term[i2]=='\0'){
+ term[i2]=0;
+ break;
+ }
+ }
+ SetError(38,term,cp);
+
+ //レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+
+ goto error;
+ }
+
+
+ /////////////////////
+ // 戻り値の処理
+ /////////////////////
+
+ //大きな型への暗黙の変換
+ type[sp]=AutoBigCast(BaseType,i2);
+ bLiteralCalculation=0;
+
+ SetUseRegFromRax(i2,UseReg,XmmReg);
+
+ if(IsRealNumberType(i2)) bXmm=1;
+ else bXmm=0;
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+
+
+ if(bXmm) pobj_reg->LockXmmReg();
+ else pobj_reg->LockReg();
+
+ if(i2==DEF_OBJECT){
+ //Object型が戻ったときはヒープ領域にインスタンスが格納されている
+ //※後にfreeする必要あり
+ bUseHeap[sp]=1;
+ }
+
+ sp++;
+ break;
+ }
+ else if(GetConstCalcBuffer(temporary,temp2,temp3)){
+ /////////////////////////
+ // マクロ関数
+ /////////////////////////
+
+ //閉じカッコ")"に続く文字がNULLでないときはエラーにする
+ if(term[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
+
+ //マクロ関数の場合
+ i2=NumOpe(&UseReg,temp3,0,0,&index_stack[sp]);
+
+ if(!IS_LITERAL(index_stack[sp])){
+ //リテラル値ではなかったとき
+ bLiteralCalculation=0;
+ }
+
+ type[sp]=i2;
+
+ if(IsRealNumberType(i2)) pobj_reg->LockXmmReg();
+ else pobj_reg->LockReg();
+
+ sp++;
+ break;
+ }
+ }
+
+
+ char variable[VN_SIZE],array_element[VN_SIZE];
+ CClass *pobj_c;
+ GetArrayElement(term,variable,array_element);
+ if(array_element[0]){
+ i2=GetVarType(variable,(LONG_PTR *)&pobj_c,0);
+ if(i2==DEF_OBJECT){
+ TYPEINFO RetTypeInfo;
+ CallArrayOperatorProc(UseReg,pobj_c,variable,array_element,RetTypeInfo);
+ type[sp]=RetTypeInfo.type;
+ index_stack[sp]=RetTypeInfo.u.lpIndex;
+ bLiteralCalculation=0;
+
+ if(IsRealNumberType(RetTypeInfo.type)) pobj_reg->LockXmmReg();
+ else pobj_reg->LockReg();
+ sp++;
+ break;
+ }
+ }
+
+
+ RELATIVE_VAR RelativeVar;
+ if(GetVarOffset(0,term,&i2,&RelativeVar,&index_stack[sp])){
+ //////////
+ // 変数
+ //////////
+
+ //大きな型への暗黙の変換
+ type[sp]=AutoBigCast(BaseType,i2);
+ bLiteralCalculation=0;
+
+ if(type[sp]!=i2){
+ //大きな型へ変換された場合(レジスタを0に初期化する)
+
+ //xor reg,reg
+ op_zero_reg(UseReg);
+ }
+
+ if(i2&FLAG_PTR){
+ //配列ポインタ
+ type[sp]=GetPtrType(i2^FLAG_PTR,index_stack[sp]);
+
+ SetVarPtrToReg(UseReg,&RelativeVar);
+ }
+ else if(IsRealNumberType(i2)){
+ //実数型
+ bXmm=1;
+
+ if(i2==DEF_DOUBLE)
+ SetXmmReg_DoubleVariable(&RelativeVar,XmmReg);
+ if(i2==DEF_SINGLE)
+ SetXmmReg_SingleVariable(&RelativeVar,XmmReg);
+ }
+ else if(IsWholeNumberType(i2)){
+ //整数型
+ SetReg_WholeVariable(i2,&RelativeVar,UseReg);
+ }
+ else if(i2==DEF_OBJECT){
+ //オブジェクト ポインタをUseRegへ格納
+ SetVarPtrToReg(UseReg,&RelativeVar);
+ }
+ else SetError(11,term,cp);
+
+ if(bXmm==0&&UseReg==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+ if(bXmm&&XmmReg==REG_XMM4){
+ if(i2==DEF_DOUBLE){
+ //movsd qword ptr[rsp+offset],xmm4 ※スタックフレームを利用
+ pobj_sf->push(REG_XMM4,sizeof(double));
+ }
+ if(i2==DEF_SINGLE){
+ //movss dword ptr[rsp+offset],xmm4 ※スタックフレームを利用
+ pobj_sf->push(REG_XMM4,sizeof(float));
+ }
+ }
+
+ if(bXmm) pobj_reg->LockXmmReg();
+ else pobj_reg->LockReg();
+ sp++;
+ break;
+ }
+
+
+ //////////////
+ // 定数の場合
+ //////////////
+
+ i3=GetConstValue(term,&dbl,temporary,&index_stack[sp]);
+ if(i3!=-1){
+ type[sp]=i3;
+ if(IsRealNumberType(i3)){
+ //実数
+ memcpy(&i64data,&dbl,sizeof(double));
+ goto Literal;
+ }
+ else if(IsWholeNumberType(i3)){
+ //整数
+ i64data=(_int64)dbl;
+ goto Literal;
+ }
+ else if(Is64Type(i3)){
+ //64ビット整数値
+ memcpy(&i64data,&dbl,sizeof(_int64));
+ goto Literal;
+ }
+ else if(i3==DEF_STRING){
+ //リテラル文字列
+
+ //バイト数
+ i3=(int)dbl;
+
+ memcpy(term,temporary,i3);
+ goto StrLiteral;
+ }
+ else{
+ SetError(1,NULL,0);
+ goto error;
+ }
+ }
+
+
+ //////////////
+ // 型名の場合
+ //////////////
+
+ LONG_PTR lp;
+ i3=GetTypeFixed(term,&lp);
+ if(i3!=-1){
+ type[sp]=i3|FLAG_CAST;
+ index_stack[sp]=lp;
+ sp++;
+ break;
+ }
+
+
+
+ /////////////////////////////////
+ // プロパティ用のメソッド
+ /////////////////////////////////
+
+ //配列要素を排除
+ char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+ GetArrayElement(term,VarName,ArrayElements);
+
+ if(GetSubHash(VarName,0)){
+
+ //////////////////////////////////////////////////////
+ ///// レジスタ資源のバックアップ
+ { BACKUP_REGISTER_RESOURCE
+ //////////////////////////////////////////////////////
+
+ TYPEINFO RetTypeInfo;
+ CallPropertyMethod(term,NULL,&RetTypeInfo);
+
+ //大きな型への暗黙の変換
+ type[sp]=AutoBigCast(BaseType,RetTypeInfo.type);
+
+ index_stack[sp]=RetTypeInfo.u.lpIndex;
+ bLiteralCalculation=0;
+
+ SetUseRegFromRax(RetTypeInfo.type,UseReg,XmmReg);
+
+ if(IsRealNumberType(i2)) bXmm=1;
+ else bXmm=0;
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+
+ if(type[sp]==DEF_OBJECT){
+ //Object型が戻ったときはヒープ領域にインスタンスが格納されている
+ //※後にfreeする必要あり
+ bUseHeap[sp]=1;
+ }
+
+ if(bXmm) pobj_reg->LockXmmReg();
+ else pobj_reg->LockReg();
+ sp++;
+ break;
+ }
+
+
+
+ //該当する識別子が見当たらないときはエラー扱いにする
+ bError=1;
+ SetError(3,term,cp);
+ type[sp]=DEF_DOUBLE;
+ }
+ else{
+ //リテラル値
+ type[sp]=GetLiteralValue(term,&i64data,BaseType);
+Literal:
+ if(type[sp]==DEF_DOUBLE){
+ //64ビット浮動小数型
+ bXmm=1;
+
+ if(XmmReg==REG_XMM4){
+ //mov r14,i64data
+ op_mov64_ToReg(REG_R14,i64data);
+
+
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+ else{
+ i3=AddDataTable((char *)&i64data,sizeof(_int64));
+
+ //movlpd xmm_reg,qword ptr[data table offset]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x12;
+ OpBuffer[obp++]=(char)(0x04 | REGISTER_OPERAND(XmmReg)<<3);
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=i3;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(type[sp]==DEF_SINGLE){
+ //32ビット浮動小数型
+ bXmm=1;
+
+ float flt;
+ int i32data;
+ memcpy(&dbl,&i64data,sizeof(double));
+ flt=(float)dbl;
+ memcpy(&i32data,&flt,sizeof(long));
+
+ if(XmmReg==REG_XMM4){
+ //push term
+ op_push_value(i32data);
+ }
+ else{
+ i3=AddDataTable((char *)&i32data,sizeof(long));
+
+ //movss xmm_reg,dword ptr[data table offset]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x10;
+ OpBuffer[obp++]=(char)(0x04 | REGISTER_OPERAND(XmmReg)<<3);
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=i3;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else{
+ //整数
+
+ index_stack[sp]=GetLiteralIndex(i64data);
+
+ //mov reg,i64data
+ op_mov64_ToReg(UseReg,i64data);
+
+ if(UseReg==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+ }
+ }
+
+ if(bXmm) pobj_reg->LockXmmReg();
+ else pobj_reg->LockReg();
+
+ sp++;
+ break;
+
+ //論理演算子
+ case CALC_XOR:
+ case CALC_OR:
+ case CALC_AND:
+ if(!CalcTwoTerm_Logical(idCalc,type,index_stack,&sp)) goto error;
+ break;
+ case CALC_NOT:
+ //value[sp-1]=Not value[sp-1]
+ //NOT演算子
+ if(!Calc_Not(type,sp)) goto error;
+ break;
+
+ //比較演算子
+ case CALC_PE: //value[sp-2] <= value[sp-1]
+ case CALC_QE: //value[sp-2] >= value[sp-1]
+ case CALC_P: //value[sp-2] < value[sp-1]
+ case CALC_Q: //value[sp-2] > value[sp-1]
+ case CALC_NOTEQUAL: //value[sp-2] <> value[sp-1]
+ case CALC_EQUAL: //value[sp-2] = value[sp-1]
+ if(!CalcTwoTerm_Relational(idCalc,type,index_stack,&sp)) goto error;
+ break;
+
+ //ビットシフト
+ case CALC_SHL: //value[sp-2] << value[sp-1]
+ case CALC_SHR: //value[sp-2] >> value[sp-1]
+ if(!Calc_Shift(idCalc,type,&sp)) goto error;
+ break;
+
+ //算術演算
+ case CALC_ADDITION:
+ case CALC_SUBTRACTION:
+ case CALC_PRODUCT:
+ if(!CalcTwoTerm_Arithmetic(idCalc,type,index_stack,&sp)) goto error;
+ break;
+ case CALC_MOD:
+ //value[sp-2]%=value[sp-1]
+ //剰余演算
+ if(!Calc_Mod(type,index_stack,&sp)) goto error;
+ break;
+ case CALC_QUOTIENT:
+ //value[sp-2]/=value[sp-1];
+ //除算
+ if(!Calc_Divide(type,&sp,BaseType)) goto error;
+ break;
+ case CALC_INTQUOTIENT:
+ //value[sp-2]/=value[sp-1]
+ //整数除算
+ if(!Calc_IntDivide(type,index_stack,&sp)) goto error;
+ break;
+ case CALC_MINUSMARK:
+ //value[sp-1]=-value[sp-1]
+ //符号反転
+ if(!Calc_MinusMark(type,sp)) goto error;
+ break;
+ case CALC_POWER:
+ //べき乗演算(浮動小数点演算のみ)
+ if(!Calc_Power(type,&sp)) goto error;
+ break;
+ case CALC_AS:
+ //キャスト
+ if(!Calc_Cast(type,index_stack,&sp)) goto error;
+ break;
+
+ default:
+ SetError(300,NULL,cp);
+ break;
+ }
+ }
+
+ if(bError) goto error;
+
+ if(sp!=1){
+ SetError(1,NULL,cp);
+ goto error;
+ }
+
+ if(bLiteralCalculation){
+ //右辺値が数値の定数式の場合
+ LONG_PTR lpClassIndex;
+ i2=StaticCalculation(true, Command,BaseType,&i64data,&lpClassIndex);
+
+ obp=BeforeObp;
+ pobj_SubAddrSchedule->num=Before_ProcAddrScheduleNum;
+ pobj_DataTableSchedule->num=Before_DataTableScheduleNum;
+ pobj_Reloc->copy(pobj_BackReloc);
+ pobj_sf->num=Before_StackFrameScheduleNum;
+ *pobj_reg=objReg_Backup;
+
+ if(IsRealNumberType(i2)){
+ if(IsRealNumberType(BaseType)) i2=BaseType;
+
+ XmmReg=pobj_reg->LockXmmReg();
+
+ if(i2==DEF_DOUBLE){
+ i3=AddDataTable((char *)&i64data,sizeof(_int64));
+
+ //movlpd xmm_reg,qword ptr[data table offset]
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x12;
+ OpBuffer[obp++]=(char)(0x04 | REGISTER_OPERAND(XmmReg)<<3);
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=i3;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+ }
+ if(i2==DEF_SINGLE){
+ memcpy(&dbl,&i64data,sizeof(_int64));
+
+ float flt;
+ int i32data;
+ flt=(float)dbl;
+ memcpy(&i32data,&flt,sizeof(long));
+
+ i3=AddDataTable((char *)&i32data,sizeof(long));
+
+ //movss xmm_reg,dword ptr[data table offset]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x10;
+ OpBuffer[obp++]=(char)(0x04 | REGISTER_OPERAND(XmmReg)<<3);
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=i3;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else{
+ if(!Is64Type(i2)){
+ //整数(符号有り/無し)
+
+ i3=(long)i64data;
+
+ if(GetTypeSize(i2,-1)==sizeof(char)) i3=i3&0x000000FF;
+ if(GetTypeSize(i2,-1)==sizeof(short)) i3=i3&0x0000FFFF;
+
+ i64data=(_int64)i3;
+ }
+
+ UseReg=pobj_reg->LockReg();
+
+ //mov reg,i64data
+ op_mov64_ToReg(UseReg,i64data);
+ }
+
+ type[0]=i2;
+ index_stack[0]=lpClassIndex;
+ }
+ else{
+ //右辺値が数値の定数式ではないとき
+ if(IS_LITERAL(index_stack[0])) index_stack[0]=-1;
+ }
+
+ if(plpIndex) *plpIndex=index_stack[0];
+ if(pbUseHeap) *pbUseHeap=bUseHeap[0];
+
+ if(IsRealNumberType(type[0]))
+ *pReg=pobj_reg->UnlockXmmReg();
+ else
+ *pReg=pobj_reg->UnlockReg();
+
+
+ if(bInitRegSwitch){
+ //整合性をチェック(バグ回避)
+ pobj_reg->bug_check();
+
+ //作業レジスタを解放
+ delete pobj_reg;
+ pobj_reg=0;
+ }
+
+ int RetType;
+ RetType=type[0];
+ goto finish;
+
+
+
+ //////////////////
+ // エラー処理
+ //////////////////
+
+error:
+
+ *pobj_reg=objReg_Backup;
+
+ if(bInitRegSwitch){
+ //作業レジスタを解放
+ delete pobj_reg;
+ pobj_reg=0;
+ }
+
+ RetType=-1;
+ goto finish;
+
+
+
+
+finish:
+
+ for(i=0;ipush(REG_XMM4,sizeof(double));
+ }
+ }
+ if(AnswerType==DEF_SINGLE){
+ ///////////////////////
+ // Single演算
+ ///////////////////////
+
+ if(idCalc==CALC_ADDITION){
+ //addss xmm_reg1,xmm_reg2
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x58;
+ OpBuffer[obp++]=(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2));
+ }
+ else if(idCalc==CALC_SUBTRACTION){
+ //subss xmm_reg1,xmm_reg2
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x5C;
+ OpBuffer[obp++]=(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2));
+ }
+ else if(idCalc==CALC_PRODUCT){
+ //mulss xmm_reg1,xmm_reg2
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x59;
+ OpBuffer[obp++]=(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2));
+ }
+
+ if(xmm_reg1==REG_XMM4){
+ //movss dword ptr[rsp+offset],xmm4 ※スタックフレームを利用
+ pobj_sf->push(REG_XMM4,sizeof(float));
+ }
+ }
+ }
+ else if(Is64Type(type[sp-2])||Is64Type(type[sp-1])){
+ //////////////////////
+ // 64ビット整数演算
+ //////////////////////
+
+ SetTowTermToReg_Whole64Calc(type,sp,®1,®2);
+
+ if(idCalc==CALC_ADDITION){
+ //add reg1,reg2
+ op_add64_reg(reg1,reg2);
+ }
+ else if(idCalc==CALC_SUBTRACTION){
+ //sub reg1,reg2
+ op_sub64_reg(reg1,reg2);
+ }
+ else if(idCalc==CALC_PRODUCT){
+ //mul reg1,reg2
+ op_imul_reg(sizeof(_int64),reg1,reg2);
+ }
+
+ if(reg1==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+ }
+ else{
+ //32ビット以下の整数演算
+
+ SetTowTermToReg_Whole32Calc(type,sp,®1,®2);
+
+ if(idCalc==CALC_ADDITION){
+ //add reg1,reg2
+ op_add32_reg(reg1,reg2);
+ }
+ else if(idCalc==CALC_SUBTRACTION){
+ //sub reg1,reg2
+ op_sub32_reg(reg1,reg2);
+ }
+ else if(idCalc==CALC_PRODUCT){
+ //mul reg1,reg2
+ op_imul_reg(sizeof(long),reg1,reg2);
+ }
+
+ if(reg1==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+ }
+
+ sp--;
+ type[sp-1]=AnswerType;
+
+ *pStackPointer=sp;
+
+ return 1;
+}
+
+
+
+BOOL Calc_Mod(int *type,LONG_PTR *index_stack,int *pStackPointer){
+ //value[sp-2]%=value[sp-1]
+ //剰余演算
+
+ int reg1,reg2;
+ int AnswerType;
+
+ int sp;
+ sp=*pStackPointer;
+
+ if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+ //実数演算は行えないため、エラー扱い
+ SetError(45,"mod",cp);
+ return 0;
+ }
+
+ /////////////////////////
+ // 64ビット整数演算のみ
+ /////////////////////////
+
+ AnswerType=NeutralizationType(type[sp-2],index_stack[sp-2],type[sp-1],index_stack[sp-1]);
+
+ //2つの項を適切なレジスタにセット
+ SetTowTermToReg_Whole64Calc(type,sp,®1,®2);
+
+ if(reg2==REG_RAX||reg2==REG_RDX){
+ //mov r15,reg2
+ op_mov64_ToReg_FromReg(REG_R15,reg2);
+
+ reg2=REG_R15;
+ }
+
+ //mov qword ptr[rsp+offset],rax ※スタックフレームを利用
+ pobj_sf->push(REG_RAX);
+
+ if(reg1!=REG_RDX){
+ //mov qword ptr[rsp+offset],rdx ※スタックフレームを利用
+ pobj_sf->push(REG_RDX);
+ }
+
+ //mov rax,reg1
+ op_mov64_ToReg_FromReg(REG_RAX,reg1);
+
+ if(IsSignedType(type[sp-2])){
+ //符号拡張
+ //rdx:rax ← rax
+
+ //cqo
+ OpBuffer[obp++]=(char)0x48;
+ OpBuffer[obp++]=(char)0x99;
+ }
+ else{
+ //ビット拡張
+ //rdx:rax ← rax
+
+ //xor rdx,rdx
+ op_zero_reg(REG_RDX);
+ }
+
+ if(IsSignedType(AnswerType)){
+ //idiv reg2
+ op_idiv64_reg(reg2);
+ }
+ else{
+ //div reg2
+ op_div64_reg(reg2);
+ }
+
+ //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_RAX);
+
+ //mov reg1,rdx
+ op_mov64_ToReg_FromReg(reg1,REG_RDX);
+
+ if(reg1!=REG_RDX){
+ //mov rdx,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_RDX);
+ }
+
+ if(reg1==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+
+ sp--;
+ type[sp-1]=AnswerType;
+
+
+ *pStackPointer=sp;
+
+ return 1;
+}
+
+BOOL Calc_Divide(int *type,int *pStackPointer,int BaseType){
+ //value[sp-2]/=value[sp-1];
+ //除算
+
+ int sp;
+ sp=*pStackPointer;
+
+ ///////////////////////
+ // 実数演算のみ
+ ///////////////////////
+
+ int AnswerType;
+ if(type[sp-2]==DEF_SINGLE&&type[sp-1]==DEF_SINGLE&&BaseType==DEF_SINGLE) AnswerType=DEF_SINGLE;
+ else AnswerType=DEF_DOUBLE;
+
+ int xmm_reg1,xmm_reg2;
+
+ //2つの項を適切なレジスタにセット
+ SetTowTermToReg_RealCalc(AnswerType,type,sp,&xmm_reg1,&xmm_reg2);
+
+ if(AnswerType==DEF_DOUBLE){
+ ///////////////////////
+ // Double演算
+ ///////////////////////
+
+ //divsd xmm_reg1,xmm_reg2
+ OpBuffer[obp++]=(char)0xF2;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x5E;
+ OpBuffer[obp++]=(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2));
+
+ if(xmm_reg1==REG_XMM4){
+ //movsd qword ptr[rsp+offset],xmm4 ※スタックフレームを利用
+ pobj_sf->push(REG_XMM4,sizeof(double));
+ }
+ }
+ if(AnswerType==DEF_SINGLE){
+ ///////////////////////
+ // Single演算
+ ///////////////////////
+
+ //divss xmm_reg1,xmm_reg2
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x5E;
+ OpBuffer[obp++]=(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2));
+
+ if(xmm_reg1==REG_XMM4){
+ //movss dword ptr[rsp+offset],xmm4 ※スタックフレームを利用
+ pobj_sf->push(REG_XMM4,sizeof(float));
+ }
+ }
+
+ sp--;
+ type[sp-1]=AnswerType;
+
+
+ *pStackPointer=sp;
+
+ return 1;
+}
+
+BOOL Calc_IntDivide(int *type,LONG_PTR *index_stack,int *pStackPointer){
+ //value[sp-2]/=value[sp-1]
+ //除算(整数)
+
+ int reg1,reg2;
+ int AnswerType;
+
+ int sp;
+ sp=*pStackPointer;
+
+ if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+ //実数演算は行えないため、エラー扱い
+ SetError(45,"mod",cp);
+ return 0;
+ }
+
+ /////////////////////////
+ // 64ビット整数演算のみ
+ /////////////////////////
+
+ AnswerType=NeutralizationType(type[sp-2],index_stack[sp-2],type[sp-1],index_stack[sp-1]);
+
+ //2つの項を適切なレジスタにセット
+ SetTowTermToReg_Whole64Calc(type,sp,®1,®2);
+
+ if(reg2==REG_RAX||reg2==REG_RDX){
+ //mov r15,reg2
+ op_mov64_ToReg_FromReg(REG_R15,reg2);
+
+ reg2=REG_R15;
+ }
+
+ //mov qword ptr[rsp+offset],rdx ※スタックフレームを利用
+ pobj_sf->push(REG_RDX);
+
+ if(reg1!=REG_RAX){
+ //mov qword ptr[rsp+offset],rax ※スタックフレームを利用
+ pobj_sf->push(REG_RAX);
+ }
+
+ //mov rax,reg1
+ op_mov64_ToReg_FromReg(REG_RAX,reg1);
+
+ if(IsSignedType(type[sp-2])){
+ //符号拡張
+ //rdx:rax ← rax
+
+ //cqo
+ OpBuffer[obp++]=(char)0x48;
+ OpBuffer[obp++]=(char)0x99;
+ }
+ else{
+ //ビット拡張
+ //rdx:rax ← rax
+
+ //xor rdx,rdx
+ op_zero_reg(REG_RDX);
+ }
+
+ if(IsSignedType(AnswerType)){
+ //idiv reg2
+ op_idiv64_reg(reg2);
+ }
+ else{
+ //div reg2
+ op_div64_reg(reg2);
+ }
+
+ //mov reg1,rax
+ op_mov64_ToReg_FromReg(reg1,REG_RAX);
+
+ if(reg1!=REG_RAX){
+ //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_RAX);
+ }
+
+ //mov rdx,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_RDX);
+
+
+ if(reg1==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+
+ sp--;
+ type[sp-1]=AnswerType;
+
+
+ *pStackPointer=sp;
+
+ return 1;
+}
+
+BOOL Calc_MinusMark(int *type,int sp){
+ //value[sp-1]=-value[sp-1]
+ //符号反転
+
+ int xmm_reg;
+ int reg;
+ int i32data;
+
+ if(type[sp-1]==DEF_DOUBLE){
+ SetOneTermToReg_RealCalc(type[sp-1],&xmm_reg);
+
+ double dbl;
+ dbl=-1;
+ i32data=AddDataTable((char *)&dbl,sizeof(double));
+
+ //mulsd xmm_reg,qword ptr[data table offset] ※data = -1
+ OpBuffer[obp++]=(char)0xF2;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x59;
+ OpBuffer[obp++]=(char)(0x04 | REGISTER_OPERAND(xmm_reg)<<3);
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=i32data;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+
+ if(xmm_reg==REG_XMM4){
+ //movsd qword ptr[rsp+offset],xmm4 ※スタックフレームを利用
+ pobj_sf->push(REG_XMM4,sizeof(double));
+ }
+ }
+ else if(type[sp-1]==DEF_SINGLE){
+ SetOneTermToReg_RealCalc(type[sp-1],&xmm_reg);
+
+ float flt;
+ flt=-1;
+ i32data=AddDataTable((char *)&flt,sizeof(float));
+
+ //mulss xmm_reg,dword ptr[data table offset] ※data = -1
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x59;
+ OpBuffer[obp++]=(char)(0x04 | REGISTER_OPERAND(xmm_reg)<<3);
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=i32data;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+
+ if(xmm_reg==REG_XMM4){
+ //movss dword ptr[rsp+offset],xmm4 ※スタックフレームを利用
+ pobj_sf->push(REG_XMM4,sizeof(float));
+ }
+ }
+ else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ SetOneTermToReg_Whole64Calc(type[sp-1],®);
+
+ //imul reg,-1
+ op_imul_value(sizeof(_int64),reg,-1);
+
+ if(reg==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+
+ type[sp-1]=DEF_INT64; //QWordはInt64へ
+ }
+ else if(IsWholeNumberType(type[sp-1])){
+ SetOneTermToReg_Whole32Calc(type[sp-1],®);
+
+ //imul reg,-1
+ op_imul_value(sizeof(long),reg,-1);
+
+ if(reg==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+
+ type[sp-1]=GetSignedType(type[sp-1]);
+ }
+
+ return 1;
+}
+
+BOOL Calc_Power(int *type,int *pStackPointer){
+ //べき乗(実数演算のみ)
+
+ int sp;
+ sp=*pStackPointer;
+
+
+ //2つの項を適切なレジスタにセット
+ int xmm_reg1,xmm_reg2;
+ SetTowTermToReg_RealCalc(DEF_DOUBLE,type,sp,&xmm_reg1,&xmm_reg2);
+
+
+ //////////////////////////////////////////////////////
+ ///// レジスタ資源のバックアップ
+ { BACKUP_REGISTER_RESOURCE
+ //////////////////////////////////////////////////////
+
+
+ ////////////////
+ // 呼び出し
+ ////////////////
+
+ if(xmm_reg1==REG_XMM1){
+ //movsd xmm0,xmm_reg1
+ op_movsd_RR(REG_XMM0,xmm_reg1);
+
+ //movsd xmm1,xmm_reg2
+ op_movsd_RR(REG_XMM1,xmm_reg2);
+ }
+ else{
+ //movsd xmm1,xmm_reg2
+ op_movsd_RR(REG_XMM1,xmm_reg2);
+
+ //movsd xmm0,xmm_reg1
+ op_movsd_RR(REG_XMM0,xmm_reg1);
+ }
+
+ //call pow
+ extern SUBINFO *pSub_pow;
+ op_call(pSub_pow);
+
+ //movsd xmm4,xmm0
+ op_movsd_RR(REG_XMM4,REG_XMM0);
+
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+
+
+ //////////////////////////////////
+ // 戻り値を所定のレジスタへ格納
+ //////////////////////////////////
+
+ if(xmm_reg1==REG_XMM4){
+ //movsd qword ptr[rsp+offset],xmm4 ※スタックフレームを利用
+ pobj_sf->push(REG_XMM0,sizeof(double));
+ }
+ else{
+ //movsd xmm_reg1,xmm4
+ op_movsd_RR(xmm_reg1,REG_XMM4);
+ }
+
+
+ sp--;
+ type[sp-1]=DEF_DOUBLE;
+
+ *pStackPointer=sp;
+ return 1;
+}
+
+BOOL Calc_Shift(int idCalc,int *type,int *pStackPointer){
+ //ビットシフト
+
+ int sp;
+ sp=*pStackPointer;
+
+ if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+ //いずれかの項が実数のとき
+ SetError(45,"<<",cp);
+ return 0;
+ }
+
+
+ /////////////////////////
+ // 64ビット整数演算のみ
+ /////////////////////////
+ int reg1,reg2;
+
+ //2つの項を適切なレジスタにセット
+ SetTowTermToReg_Whole64Calc(type,sp,®1,®2);
+
+ int sw=0;
+ if(reg1==REG_RCX){
+ //mov r15,rcx
+ op_mov64_ToReg_FromReg(REG_R15,REG_RCX);
+
+ reg1=REG_R15;
+ }
+ else if(reg2!=REG_RCX){
+ sw=1;
+
+ //mov qword ptr[rsp+offset],rcx ※スタックフレームを利用
+ pobj_sf->push(REG_RCX);
+ }
+
+ //mov rcx,reg2
+ op_mov64_ToReg_FromReg(REG_RCX,reg2);
+
+ if(idCalc==CALC_SHL){
+ //左シフトは符号あり、なしは同様の動きをする
+
+ //32ビット型にする
+ if(!Is64Type(type[sp-2])){
+ ExtendTypeTo32(type[sp-2],reg1);
+
+ if(IsSignedType(type[sp-2])) type[sp-2]=DEF_LONG;
+ else type[sp-2]=DEF_DWORD;
+ }
+
+ //shl reg1,cl
+ op_shl_reg(GetTypeSize(type[sp-2],-1),reg1);
+ }
+ else if(idCalc==CALC_SHR){
+ if(IsSignedType(type[sp-2])){
+ //符号あり
+
+ //sar
+ op_sar_reg(GetTypeSize(type[sp-2],-1),reg1);
+ }
+ else{
+ //符号なし
+
+ //shr
+ op_shr_reg(GetTypeSize(type[sp-2],-1),reg1);
+ }
+ }
+
+ if(sw==0){
+ //mov rcx,r15
+ op_mov64_ToReg_FromReg(REG_RCX,REG_R15);
+ }
+ else{
+ //mov rcx,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_RCX);
+ }
+
+ if(reg1==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+
+ sp--;
+
+ *pStackPointer=sp;
+ return 1;
+}
Index: /BasicCompiler64/NumOpe_Logical.cpp
===================================================================
--- /BasicCompiler64/NumOpe_Logical.cpp (revision 3)
+++ /BasicCompiler64/NumOpe_Logical.cpp (revision 3)
@@ -0,0 +1,114 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+BOOL CalcTwoTerm_Logical(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer){
+ //value[sp-2] xor= value[sp-1]
+ //xor演算
+
+ int sp;
+ sp=*pStackPointer;
+
+ if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+ //いずれかの項が実数のとき
+ SetError(45,"xor",cp);
+ return 0;
+ }
+
+ int reg1,reg2;
+
+ if(Is64Type(type[sp-2])||Is64Type(type[sp-1])){
+ //////////////////////
+ // 64ビット整数演算
+ //////////////////////
+
+ SetTowTermToReg_Whole64Calc(type,sp,®1,®2);
+
+ if(idCalc==CALC_XOR){
+ //xor reg1,reg2
+ op_xor_reg(sizeof(_int64),reg1,reg2);
+ }
+ else if(idCalc==CALC_OR){
+ //or reg1,reg2
+ op_or_reg(sizeof(_int64),reg1,reg2);
+ }
+ else if(idCalc==CALC_AND){
+ //and reg1,reg2
+ op_and_reg(sizeof(_int64),reg1,reg2);
+ }
+
+ if(reg1==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+
+ sp--;
+ type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
+ }
+ else{
+ //32ビット以下の整数演算
+
+ SetTowTermToReg_Whole32Calc(type,sp,®1,®2);
+
+ if(idCalc==CALC_ADDITION){
+ //add reg1,reg2
+ op_xor_reg(sizeof(long),reg1,reg2);
+ }
+ else if(idCalc==CALC_OR){
+ //or reg1,reg2
+ op_or_reg(sizeof(long),reg1,reg2);
+ }
+ else if(idCalc==CALC_AND){
+ //and reg1,reg2
+ op_and_reg(sizeof(long),reg1,reg2);
+ }
+
+ if(reg1==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+
+ sp--;
+ type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
+ }
+
+ *pStackPointer=sp;
+ return 1;
+}
+
+BOOL Calc_Not(int *type,int sp){
+ //value[sp-1]=Not value[sp-1]
+ //NOT演算子
+
+ if(IsRealNumberType(type[sp-1])){
+ //実数のとき
+ SetError(45,"Not",cp);
+ return 0;
+ }
+
+ int reg;
+
+ if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+ SetOneTermToReg_Whole64Calc(type[sp-1],®);
+
+ //not reg
+ op_not_reg(sizeof(_int64),reg);
+
+ if(reg==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+ }
+ else if(IsWholeNumberType(type[sp-1])){
+ SetOneTermToReg_Whole32Calc(type[sp-1],®);
+
+ //not reg
+ op_not_reg(sizeof(long),reg);
+
+ if(reg==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+ }
+
+ return 1;
+}
Index: /BasicCompiler64/NumOpe_Relation.cpp
===================================================================
--- /BasicCompiler64/NumOpe_Relation.cpp (revision 3)
+++ /BasicCompiler64/NumOpe_Relation.cpp (revision 3)
@@ -0,0 +1,164 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+BOOL CalcTwoTerm_Relational(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer){
+ int reg1,reg2;
+ int AnswerType;
+
+ int sp;
+ sp=*pStackPointer;
+
+ AnswerType=NeutralizationType(type[sp-2],index_stack[sp-2],type[sp-1],index_stack[sp-1]);
+
+ if(IsRealNumberType(AnswerType)){
+ ////////////////
+ // 実数演算
+ ////////////////
+ int xmm_reg1,xmm_reg2;
+
+ //2つの項を適切なレジスタにセット
+ SetTowTermToReg_RealCalc(AnswerType,type,sp,&xmm_reg1,&xmm_reg2);
+
+ if(AnswerType==DEF_DOUBLE){
+ //comisd xmm_reg1,xmm_reg2
+ op_comisd(xmm_reg1,xmm_reg2);
+ }
+ else if(AnswerType==DEF_SINGLE){
+ //comiss xmm_reg1,xmm_reg2
+ op_comiss(xmm_reg1,xmm_reg2);
+ }
+
+ //Xmmレジスタを解放
+ pobj_reg->UnlockXmmReg();
+
+ //汎用レジスタを確保
+ reg1=pobj_reg->LockReg();
+ }
+ else if(Is64Type(AnswerType)){
+ //////////////////////
+ // 64ビット整数演算
+ //////////////////////
+
+ //2つの項を適切なレジスタにセット
+ SetTowTermToReg_Whole64Calc(type,sp,®1,®2);
+
+ //cmp reg1,reg2
+ op_cmp_reg(sizeof(_int64),reg1,reg2);
+ }
+ else{
+ //////////////////////
+ // 32ビット整数演算
+ //////////////////////
+
+ //2つの項を適切なレジスタにセット
+ SetTowTermToReg_Whole32Calc(type,sp,®1,®2);
+
+ //cmp reg1,reg2
+ op_cmp_reg(sizeof(long),reg1,reg2);
+ }
+
+
+ ////////////////////
+ // 条件分岐
+ ////////////////////
+
+ if(idCalc==CALC_PE){
+ // reg1 <= reg2
+ if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
+ //符号あり演算
+ //jle
+ OpBuffer[obp++]=(char)0x7E;
+ }
+ else{
+ //符号なし演算
+ //jbe
+ OpBuffer[obp++]=(char)0x76;
+ }
+ }
+ else if(idCalc==CALC_QE){
+ // reg1 >= reg2
+ if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
+ //符号あり演算
+ //jge
+ OpBuffer[obp++]=(char)0x7D;
+ }
+ else{
+ //符号なし演算
+ //jae
+ OpBuffer[obp++]=(char)0x73;
+ }
+ }
+ else if(idCalc==CALC_P){
+ // reg1 < reg2
+ if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
+ //符号あり演算
+ //jl
+ OpBuffer[obp++]=(char)0x7C;
+ }
+ else{
+ //符号なし演算
+ //jb
+ OpBuffer[obp++]=(char)0x72;
+ }
+ }
+ else if(idCalc==CALC_Q){
+ // reg1 > reg2
+ if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
+ //符号あり演算
+ //jg
+ OpBuffer[obp++]=(char)0x7F;
+ }
+ else{
+ //符号なし演算
+ //ja
+ OpBuffer[obp++]=(char)0x77;
+ }
+ }
+ else if(idCalc==CALC_NOTEQUAL){
+ // reg1 <> reg2
+
+ //jne
+ OpBuffer[obp++]=(char)0x75;
+ }
+ else if(idCalc==CALC_EQUAL){
+ // reg1 = reg2
+
+ //je
+ OpBuffer[obp++]=(char)0x74;
+ }
+ OpBuffer[obp++]=(char)0x05;
+
+
+ //////////////////////
+ // FALSEをセット
+ //////////////////////
+
+ //xor reg1,reg1
+ op_zero_reg(reg1);
+
+ //jmp 7(xorを飛び越す)
+ OpBuffer[obp++]=(char)0xEB;
+ OpBuffer[obp++]=(char)0x07;
+
+
+ ///////////////////
+ // TRUEをセット
+ ///////////////////
+
+ //mov reg1,-1
+ op_mov_RV(sizeof(_int64),reg1,-1);
+
+
+ if(reg1==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+
+ sp--;
+
+ *pStackPointer=sp;
+
+ type[sp-1]=DEF_LONG;
+
+ return 1;
+}
Index: /BasicCompiler64/NumOpe_TypeOperation.cpp
===================================================================
--- /BasicCompiler64/NumOpe_TypeOperation.cpp (revision 3)
+++ /BasicCompiler64/NumOpe_TypeOperation.cpp (revision 3)
@@ -0,0 +1,561 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void ExtendTypeTo64(int type,int reg){
+ if(type==DEF_LONG){
+ //movsxd reg64,reg32
+ op_movsxd(reg,reg);
+ }
+ else if(type==DEF_DWORD){
+ //and reg,00000000FFFFFFFFh
+ }
+ else if(type==DEF_INTEGER){
+ //movsx reg64,reg16
+ op_movsx64_FromReg16(reg,reg);
+ }
+ else if(type==DEF_WORD){
+ //and reg,000000000000FFFFh
+ op_and64_value(reg,(int)0xFFFF);
+ }
+ else if(type==DEF_CHAR){
+ //movsx reg64,reg8
+ op_movsx64_FromReg8(reg,reg);
+ }
+ else if(type==DEF_BYTE){
+ //and reg,00000000000000FFh
+ op_and64_value(reg,(int)0x00FF);
+ }
+}
+void ExtendTypeTo32(int type,int reg){
+ if(type==DEF_INTEGER){
+ //movsx reg32,reg16
+ op_movsx32_FromReg16(reg,reg);
+ }
+ else if(type==DEF_WORD){
+ //and reg,0000FFFFh
+ op_and32_value(reg,(int)0xFFFF);
+ }
+ else if(type==DEF_CHAR){
+ //movsx reg32,reg8
+ op_movsx32_FromReg8(reg,reg);
+ }
+ else if(type==DEF_BYTE){
+ //and reg,000000FFh
+ op_and32_value(reg,(int)0xFF);
+ }
+}
+void ExtendTypeTo16(int type,int reg){
+ if(type==DEF_CHAR){
+ //movsx reg16,reg8
+ op_movsx16_FromReg8(reg,reg);
+ }
+ else if(type==DEF_BYTE){
+ //and reg,000000FFh
+ op_and32_value(reg,(int)0xFF);
+ }
+}
+
+void ChangeTypeToXmm_Double(int type,int xmm_reg,int general_reg){
+ if(type==DEF_DOUBLE){
+ //なにもしない
+ }
+ else if(type==DEF_SINGLE){
+ //Single型
+
+ //cvtss2sd
+ op_cvtss2sd(xmm_reg,xmm_reg);
+ }
+ else if(Is64Type(type)){
+ //64ビット整数型
+
+ //cvtsi2sd xmm_reg,reg
+ op_cvtsi2sd_reg(sizeof(_int64),xmm_reg,general_reg);
+
+ if(type==DEF_QWORD){
+ //符号なし
+
+ //test reg,reg
+ op_test(general_reg,general_reg);
+
+ //jge 9
+ OpBuffer[obp++]=(char)0x7D;
+ OpBuffer[obp++]=(char)0x09;
+
+ //addsd xmm_reg,qword ptr[offset] ※offset value:43f0000000000000
+ int temp;
+ _int64 i64data=0x43f0000000000000;
+ temp=AddDataTable((char *)&i64data,sizeof(_int64));
+ OpBuffer[obp++]=(char)0xF2;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x58;
+ OpBuffer[obp++]=(char)(0x04 | REGISTER_OPERAND(xmm_reg)<<3);
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=temp;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(type==DEF_DWORD){
+ //符号なし32ビット値
+
+ //64ビットにレジスタ値を拡張
+ ExtendTypeTo64(type,general_reg);
+
+ //cvtsi2sd xmm_reg,reg
+ op_cvtsi2sd_reg(sizeof(_int64),xmm_reg,general_reg);
+ }
+ else{
+ //その他整数
+
+ //32ビットにレジスタ値を拡張
+ ExtendTypeTo32(type,general_reg);
+
+ //cvtsi2sd xmm_reg,reg
+ op_cvtsi2sd_reg(sizeof(long),xmm_reg,general_reg);
+ }
+}
+void ChangeTypeToXmm_Single(int type,int xmm_reg,int general_reg){
+ if(type==DEF_DOUBLE){
+ //Double型
+
+ //cvtsd2ss
+ op_cvtsd2ss(xmm_reg,xmm_reg);
+ }
+ else if(type==DEF_SINGLE){
+ //なにもしない
+ }
+ else if(Is64Type(type)){
+ //64ビット整数型
+
+ //cvtsi2ss xmm_reg,reg
+ op_cvtsi2ss_reg(sizeof(_int64),xmm_reg,general_reg);
+
+ if(type==DEF_QWORD){
+ //符号なし
+
+ //test reg,reg
+ op_test(general_reg,general_reg);
+
+ //jge 9
+ OpBuffer[obp++]=(char)0x7D;
+ OpBuffer[obp++]=(char)0x09;
+
+ //addss xmm_reg,dword ptr[offset] ※offset value:5f800000
+ int temp;
+ long i32data=0x5f800000;
+ temp=AddDataTable((char *)&i32data,sizeof(long));
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x58;
+ OpBuffer[obp++]=(char)(0x04 | REGISTER_OPERAND(xmm_reg)<<3);
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=temp;
+ pobj_DataTableSchedule->add();
+ obp+=sizeof(long);
+ }
+ }
+ else if(type==DEF_DWORD){
+ //符号なし32ビット値
+
+ //64ビットにレジスタ値を拡張
+ ExtendTypeTo64(type,general_reg);
+
+ //cvtsi2ss xmm_reg,reg
+ op_cvtsi2ss_reg(sizeof(_int64),xmm_reg,general_reg);
+ }
+ else{
+ //その他整数
+
+ //32ビットにレジスタ値を拡張
+ ExtendTypeTo32(type,general_reg);
+
+ //cvtsi2ss xmm_reg,reg
+ op_cvtsi2ss_reg(sizeof(long),xmm_reg,general_reg);
+ }
+}
+
+void ChangeTypeToWhole(int OldType,int NewType,int reg,int xmm_reg){
+ if(OldType==DEF_DOUBLE){
+ if(Is64Type(NewType)){
+ //cvttsd2si reg,xmm_reg
+ op_cvttsd2si_xmm(sizeof(_int64),reg,xmm_reg);
+ }
+ else{
+ //cvttsd2si reg,xmm_reg
+ op_cvttsd2si_xmm(sizeof(long),reg,xmm_reg);
+ }
+ }
+ else if(OldType==DEF_SINGLE){
+ if(Is64Type(NewType)){
+ //cvttss2si reg,xmm_reg
+ op_cvttss2si_xmm(sizeof(_int64),reg,xmm_reg);
+ }
+ else{
+ //cvttss2si reg,xmm_reg
+ op_cvttss2si_xmm(sizeof(long),reg,xmm_reg);
+ }
+ }
+ else{
+ //整数から整数へ変換
+
+ if(Is64Type(NewType)){
+ ExtendTypeTo64(OldType,reg);
+ }
+ else if(GetTypeSize(NewType,-1)==sizeof(long)){
+ ExtendTypeTo32(OldType,reg);
+ }
+ else if(GetTypeSize(NewType,-1)==sizeof(short)){
+ ExtendTypeTo16(OldType,reg);
+ }
+ }
+}
+
+
+
+/////////////////////////////////////////
+// 1つの項を適切なレジスタへセット
+/////////////////////////////////////////
+
+void SetOneTermToReg_RealCalc(int TermType,int *pXmmReg){
+ int xmm_reg;
+
+ if(IsRealNumberType(TermType)){
+ //実数型
+ xmm_reg=pobj_reg->GetLockingXmmReg();
+
+ if(xmm_reg==REG_XMM4){
+ if(TermType==DEF_DOUBLE){
+ //movlpd xmm4,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(xmm_reg,sizeof(double));
+ }
+ if(TermType==DEF_SINGLE){
+ //movss xmm4,dword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(xmm_reg,sizeof(float));
+ }
+ }
+ }
+ else{
+ SetError(300,NULL,cp);
+ }
+
+ *pXmmReg=xmm_reg;
+}
+void SetOneTermToReg_Whole64Calc(int TermType,int *pReg){
+ //1つの項を適切なレジスタへセット(64ビット整数演算用)
+ int reg;
+
+ reg=pobj_reg->GetLockingReg();
+
+ if(reg==REG_R14){
+ //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R14);
+ }
+
+ //レジスタ値を64ビットに拡張
+ ExtendTypeTo64(TermType,reg);
+
+ *pReg=reg;
+}
+void SetOneTermToReg_Whole32Calc(int TermType,int *pReg){
+ //1つの項を適切なレジスタへセット(32ビット整数演算用)
+ int reg;
+
+ reg=pobj_reg->GetLockingReg();
+
+ if(reg==REG_R14){
+ //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R14);
+ }
+
+ //レジスタ値を32ビットに拡張
+ ExtendTypeTo32(TermType,reg);
+
+ *pReg=reg;
+}
+
+
+
+/////////////////////////////////////////
+// 2つの項を適切なレジスタへセット
+/////////////////////////////////////////
+
+void SetTowTermToReg_RealCalc(int AnswerType,int *type,int sp,int *pXmmReg1,int *pXmmReg2){
+ //2つの項を適切なレジスタへセット(Double演算用)
+ int xmm_reg1,xmm_reg2,temp_reg;
+
+
+ ///////////////////
+ // 第2項
+ ///////////////////
+
+ if(IsRealNumberType(type[sp-1])){
+ //実数型
+ xmm_reg2=pobj_reg->UnlockXmmReg();
+
+ if(xmm_reg2==REG_XMM4){
+ xmm_reg2=REG_XMM5;
+
+ if(type[sp-1]==DEF_DOUBLE){
+ //movlpd xmm5,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(xmm_reg2,sizeof(double));
+ }
+ if(type[sp-1]==DEF_SINGLE){
+ //movss xmm5,dword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(xmm_reg2,sizeof(float));
+ }
+ }
+ else{
+ if(!IsRealNumberType(type[sp-2])){
+ if(type[sp-1]==DEF_DOUBLE){
+ //movsd xmm5,xmm_reg
+ OpBuffer[obp++]=(char)0xF2;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x10;
+ OpBuffer[obp++]=(char)(0xE8 | REGISTER_OPERAND(xmm_reg2));
+ }
+ if(type[sp-1]==DEF_SINGLE){
+ //movss xmm5,xmm_reg
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x10;
+ OpBuffer[obp++]=(char)(0xE8 | REGISTER_OPERAND(xmm_reg2));
+ }
+
+ xmm_reg2=REG_XMM5;
+ }
+ }
+ }
+ else{
+ //整数値
+
+ temp_reg=pobj_reg->UnlockReg();
+
+ if(temp_reg==REG_R14){
+ //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R14);
+ }
+
+ xmm_reg2=REG_XMM5;
+ }
+
+ //汎用レジスタ(temp_reg)をXMMレジスタ(xmm_reg2)にコピー
+ if(AnswerType==DEF_DOUBLE)
+ ChangeTypeToXmm_Double(type[sp-1],xmm_reg2,temp_reg);
+ if(AnswerType==DEF_SINGLE)
+ ChangeTypeToXmm_Single(type[sp-1],xmm_reg2,temp_reg);
+
+
+ ///////////////////
+ // 第1項
+ ///////////////////
+
+ if(IsRealNumberType(type[sp-2])){
+ //実数
+ xmm_reg1=pobj_reg->GetLockingXmmReg();
+
+ if(xmm_reg1==REG_XMM4){
+ if(type[sp-2]==DEF_DOUBLE){
+ //movlpd xmm4,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(xmm_reg1,sizeof(double));
+ }
+ if(type[sp-2]==DEF_SINGLE){
+ //movss xmm4,dword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(xmm_reg1,sizeof(float));
+ }
+ }
+ }
+ else{
+ //整数
+
+ temp_reg=pobj_reg->UnlockReg();
+
+ if(temp_reg==REG_R14){
+ //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R14);
+ }
+
+ xmm_reg1=pobj_reg->LockXmmReg();
+ }
+
+ //汎用レジスタ(temp_reg)をXMMレジスタ(xmm_reg1)にコピー
+ if(AnswerType==DEF_DOUBLE)
+ ChangeTypeToXmm_Double(type[sp-2],xmm_reg1,temp_reg);
+ if(AnswerType==DEF_SINGLE)
+ ChangeTypeToXmm_Single(type[sp-2],xmm_reg1,temp_reg);
+
+
+ *pXmmReg1=xmm_reg1;
+ *pXmmReg2=xmm_reg2;
+}
+void SetTowTermToReg_Whole64Calc(int *type,int sp,int *pReg1,int *pReg2){
+ //2つの項を適切なレジスタへセット(64ビット整数演算用)
+ int reg1,reg2;
+
+ //////////////////
+ // 第2項
+ //////////////////
+ reg2=pobj_reg->UnlockReg();
+
+ if(reg2==REG_R14){
+ //mov r15,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R15);
+
+ reg2=REG_R15;
+ }
+
+ //レジスタ値を64ビットに拡張
+ ExtendTypeTo64(type[sp-1],reg2);
+
+
+ //////////////////
+ // 第1項
+ //////////////////
+ reg1=pobj_reg->GetLockingReg();
+
+ if(reg1==REG_R14){
+ //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R14);
+ }
+
+ //レジスタ値を64ビットに拡張
+ ExtendTypeTo64(type[sp-2],reg1);
+
+
+ *pReg1=reg1;
+ *pReg2=reg2;
+}
+void SetTowTermToReg_Whole32Calc(int *type,int sp,int *pReg1,int *pReg2){
+ //2つの項を適切なレジスタへセット(32ビット整数演算用)
+ int reg1,reg2;
+
+ //////////////////
+ // 第2項
+ //////////////////
+ reg2=pobj_reg->UnlockReg();
+
+ if(reg2==REG_R14){
+ //mov r15,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R15);
+
+ reg2=REG_R15;
+ }
+
+ //レジスタ値を32ビットに拡張
+ ExtendTypeTo32(type[sp-1],reg2);
+
+
+ //////////////////
+ // 第1項
+ //////////////////
+ reg1=pobj_reg->GetLockingReg();
+
+ if(reg1==REG_R14){
+ //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R14);
+ }
+
+ //レジスタ値を32ビットに拡張
+ ExtendTypeTo32(type[sp-2],reg1);
+
+
+ *pReg1=reg1;
+ *pReg2=reg2;
+}
+
+
+
+////////////////////////////
+// As 演算子によるキャスト
+////////////////////////////
+
+BOOL Calc_Cast(int *type,LONG_PTR *index_stack,int *pStackPointer){
+ //キャスト
+
+ int sp;
+ sp=*pStackPointer;
+
+ int CastType;
+ CastType=type[sp-1];
+ if((CastType&FLAG_CAST)==0){
+ SetError(47,NULL,cp);
+ return 0;
+ }
+ CastType=CastType&(~FLAG_CAST);
+
+ int xmm_reg,reg;
+
+ if(IsRealNumberType(CastType)){
+ //実数型へキャスト
+
+ if(IsRealNumberType(type[sp-2])){
+ SetOneTermToReg_RealCalc(type[sp-2],&xmm_reg);
+ }
+ else{
+ if(Is64Type(type[sp-2]))
+ SetOneTermToReg_Whole64Calc(type[sp-2],®);
+ else if(IsWholeNumberType(type[sp-2]))
+ SetOneTermToReg_Whole32Calc(type[sp-2],®);
+
+ pobj_reg->UnlockReg();
+
+ xmm_reg=pobj_reg->LockXmmReg();
+ }
+
+ if(CastType==DEF_DOUBLE){
+ //Double型にデータ変換
+ ChangeTypeToXmm_Double(type[sp-2],xmm_reg,reg);
+ }
+ else if(CastType==DEF_SINGLE){
+ //Single型にデータ変換
+ ChangeTypeToXmm_Single(type[sp-2],xmm_reg,reg);
+ }
+
+ if(xmm_reg==REG_XMM4){
+ //movsd qword ptr[rsp+offset],xmm4 ※スタックフレームを利用
+ pobj_sf->push(REG_XMM4,sizeof(double));
+ }
+ }
+ else{
+ //その他整数型へ変換
+
+ if(IsRealNumberType(type[sp-2])){
+ SetOneTermToReg_RealCalc(type[sp-2],&xmm_reg);
+
+ pobj_reg->UnlockXmmReg();
+
+ reg=pobj_reg->LockReg();
+
+ //整数型へデータ変換
+ ChangeTypeToWhole(type[sp-2],CastType,reg,xmm_reg);
+
+ if(reg==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+ }
+ else{
+ reg=pobj_reg->GetLockingReg();
+
+ if(reg==REG_R14){
+ //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R14);
+ }
+
+ //整数型へデータ変換
+ ChangeTypeToWhole(type[sp-2],CastType,reg,0);
+
+ if(reg==REG_R14){
+ //mov qword ptr[rsp+offset],r14 ※スタックフレームを利用
+ pobj_sf->push(REG_R14);
+ }
+ }
+ }
+
+ type[sp-2]=CastType;
+ index_stack[sp-2]=index_stack[sp-1];
+
+ sp--;
+
+ *pStackPointer=sp;
+ return 1;
+}
Index: /BasicCompiler64/Opcode.h
===================================================================
--- /BasicCompiler64/Opcode.h (revision 3)
+++ /BasicCompiler64/Opcode.h (revision 3)
@@ -0,0 +1,504 @@
+//Opcode.h
+
+
+//レジスタを示す定数
+#define REG_EAX 1
+#define REG_EBX 2
+#define REG_ECX 3
+#define REG_EDX 4
+#define REG_ESP 5
+#define REG_EBP 6
+
+#define REGISTER_OPERAND(reg) (reg&0x07)
+
+#define REG_NON -1
+#define REG_RAX 0x00 //reg:000
+#define REG_RCX 0x01 //reg:001
+#define REG_RDX 0x02 //reg:010
+#define REG_RBX 0x03 //reg:011
+#define REG_RSP 0x04 //reg:100
+#define REG_RBP 0x05 //reg:101
+#define REG_RSI 0x06 //reg:110
+#define REG_RDI 0x07 //reg:111
+#define REG_R8 0x08 //reg:000(REXプリフィックス)
+#define REG_R9 0x09 //reg:001(REXプリフィックス)
+#define REG_R10 0x0A //reg:010(REXプリフィックス)
+#define REG_R11 0x0B //reg:011(REXプリフィックス)
+#define REG_R12 0x0C //reg:100(REXプリフィックス)
+#define REG_R13 0x0D //reg:101(REXプリフィックス)
+#define REG_R14 0x0E //reg:110(REXプリフィックス)
+#define REG_R15 0x0F //reg:111(REXプリフィックス)
+
+#define REG_XMM0 0x10 //reg:000
+#define REG_XMM1 0x11 //reg:001
+#define REG_XMM2 0x12 //reg:010
+#define REG_XMM3 0x13 //reg:011
+#define REG_XMM4 0x14 //reg:100
+#define REG_XMM5 0x15 //reg:101
+#define REG_XMM6 0x16 //reg:110
+#define REG_XMM7 0x17 //reg:111
+#define REG_XMM8 0x18 //reg:000
+#define REG_XMM9 0x19 //reg:001
+#define REG_XMM10 0x1A //reg:010
+#define REG_XMM11 0x1B //reg:011
+#define REG_XMM12 0x1C //reg:100
+#define REG_XMM13 0x1D //reg:101
+#define REG_XMM14 0x1E //reg:110
+#define REG_XMM15 0x1F //reg:111
+
+#define IS_XMM_REG(reg) (reg&0x10)
+
+
+
+//変数の種類
+#define NON_VAR 0
+#define VAR_GLOBAL 1 //Global Variable
+#define VAR_LOCAL 2 //Local Variable
+#define VAR_REFLOCAL 3 //Local Refference Variable
+#define VAR_DIRECTMEM 4 //Direct memory
+
+extern int cp;
+extern int obp;
+extern char *OpBuffer;
+
+//ラベルアドレス
+struct LABEL{
+ char *pName;
+ int line;
+ DWORD address;
+};
+
+//Goto未知ラベル
+struct GOTOLABELSCHEDULE{
+ char *pName;
+ int line;
+ DWORD pos;
+ DWORD now_cp;
+};
+
+
+//プロシージャの種類
+#define PROC_DEFAULT 1 //ユーザー定義関数
+#define PROC_DLL 2 //DLL関数
+#define PROC_BUILTIN 3 //コンパイラ埋め込み型
+#define PROC_PTR 4 //関数ポインタ
+
+//プロシージャ
+struct PROCEDURE{
+ char name[255];
+ int address;
+ int types[MAX_PARMS];
+ _int8 ByVal[MAX_PARMS];
+ BOOL ReturnType;
+};
+
+//With情報
+struct WITHINFO{
+ char **ppName;
+ int *pWithCp;
+ int num;
+};
+
+
+class CStackFrame:public CSchedule{
+ ///////////////////////////
+ // スタックフレーム管理
+ ///////////////////////////
+
+ int lowest_sp; //スタックポインタの最下位位置
+ int now_sp; //スタックポインタ
+ int max_parm_size; //パラメータの最大サイズ
+ int local_parm_size; //ローカル領域のパラメータサイズ
+
+public:
+ //コンストラクタ
+ CStackFrame();
+
+ //デストラクタ
+ ~CStackFrame();
+
+ void SetLocalParmSize(int size);
+ int GetFrameSize();
+ void push(int reg);
+ void push(int xmm_reg,int var_size);
+ void ref(int reg);
+ void ref(int xmm_reg,int var_size);
+ void pop(int reg);
+ void pop(int xmm_reg,int var_size);
+ void parameter_allocate(int size);
+ void RunningSchedule(void);
+
+ void error_check(void);
+};
+extern CStackFrame *pobj_sf;
+
+
+class CBlockReg{
+ int array_BlockReg[256];
+ int num;
+
+public:
+ CBlockReg();
+ void lock(int reg);
+ void unlock(int reg);
+ BOOL check(int reg);
+ void clear(void);
+
+ //レジスタのバックアップと復旧
+ void backup();
+ void restore();
+};
+extern CBlockReg *pobj_BlockReg;
+class CRegister{
+ ////////////////////
+ // レジスタ管理
+ ////////////////////
+
+ //利用可能なレジスタを列挙する関数
+ void EnumRegister(int *pRegList,int nMaxList,int *array_reg,int *sp,int AnswerReg);
+
+ int array_UseReg[16],sp_UseReg;
+
+ int array_XmmReg[16];
+ int sp_XmmReg;
+
+ int init_sp_reg,init_sp_xmm_reg;
+
+public:
+ CRegister(){};
+ CRegister(int AnswerReg);
+ ~CRegister(){};
+
+ //コンパイラにバグがないかをチェックする機構
+ void bug_check();
+
+ //汎用レジスタ
+ int GetNextReg();
+ int GetLockingReg();
+ int LockReg();
+ int UnlockReg();
+
+ //XMMレジスタ
+ int GetNextXmmReg();
+ int GetLockingXmmReg();
+ int LockXmmReg();
+ int UnlockXmmReg();
+
+ //レジスタのバックアップと復旧
+ void backup();
+ void restore();
+};
+extern CRegister *pobj_reg;
+
+
+#define BACKUP_REGISTER_RESOURCE \
+ /* レジスタをスタックフレームにバックアップ */ \
+ pobj_BlockReg->backup(); \
+ if(pobj_reg) pobj_reg->backup(); \
+ \
+ /* レジスタブロッキングオブジェクトを退避して再生成 */ \
+ CBlockReg *pobj_BlockReg_back; \
+ pobj_BlockReg_back=pobj_BlockReg; \
+ pobj_BlockReg=new CBlockReg; \
+ \
+ /* レジスタ管理オブジェクトポインタを退避して0をセット */ \
+ CRegister *pobj_reg_back; \
+ pobj_reg_back=pobj_reg; \
+ pobj_reg=0;
+
+#define RESTORE_REGISTER_RESOURCE \
+ /* レジスタブロッキングオブジェクトポインタを復元 */ \
+ delete pobj_BlockReg; \
+ pobj_BlockReg=pobj_BlockReg_back; \
+ \
+ /* レジスタ管理オブジェクトポインタを復元 */ \
+ delete pobj_reg; \
+ pobj_reg=pobj_reg_back; \
+ \
+ /* レジスタをスタックフレームから復元 */ \
+ if(pobj_reg) pobj_reg->restore(); \
+ pobj_BlockReg->restore();
+
+
+
+//MakePeHdr.cpp
+int AddDataTable(char *buffer,int length);
+
+//RSrcSection.cpp
+char *GetRSrcSectionBuffer(int *pLen);
+
+//Compile.cpp
+void ChangeOpcode(char *Command);
+void GetGlobalDataForDll(void);
+DWORD CompileBuffer(char Return_Sequence,WORD Return_Command);
+
+//Register.cpp
+BOOL IsGeneralReg(int reg);
+BOOL IsXmmReg(int reg);
+BOOL IsVolatileReg(int reg);
+
+//Compile_Calc.cpp
+void ChangeTypeToDouble_ToFpuReg(int OldType);
+void ChangeTypeToDouble(int OldType);
+void ChangeTypeToSingle(int OldType);
+void ChangeTypeToInt64(int OldType);
+void ChangeTypeToLong(int OldType);
+void ChangeTypeToInteger(int OldType);
+void ChangeTypeToByte(int OldType);
+void SetVariableFromRax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar);
+void OpcodeCalc(char *Command);
+
+//NumOpe.cpp
+int NumOpe(int *pReg,char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap=0);
+
+//NumOpe_Arithmetic.cpp
+void GetStackData_ToRegister(int *type,int sp);
+BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Mod(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Divide(int *type,int *pStackPointer,int BaseType);
+BOOL Calc_IntDivide(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_MinusMark(int *type,int sp);
+BOOL Calc_Power(int *type,int *pStackPointer);
+BOOL Calc_Shift(int idCalc,int *type,int *pStackPointer);
+
+//NumOpe_Logical.cpp
+BOOL CalcTwoTerm_Logical(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Not(int *type,int sp);
+
+//NumOpe_Relation.cpp
+BOOL CalcTwoTerm_Relational(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
+
+//NumOpe_TypeOperation.cpp
+void ExtendTypeTo64(int type,int reg);
+void ExtendTypeTo32(int type,int reg);
+void ExtendTypeTo16(int type,int reg);
+void ChangeTypeToXmm_Double(int type,int xmm_reg,int general_reg);
+void ChangeTypeToXmm_Single(int type,int xmm_reg,int general_reg);
+void ChangeTypeToWhole(int OldType,int NewType,int reg,int xmm_reg);
+void SetOneTermToReg_RealCalc(int TermType,int *pXmmReg);
+void SetOneTermToReg_Whole64Calc(int TermType,int *pReg);
+void SetOneTermToReg_Whole32Calc(int TermType,int *pReg);
+void SetTowTermToReg_RealCalc(int AnswerType,int *type,int sp,int *pXmmReg1,int *pXmmReg2);
+void SetTowTermToReg_Whole64Calc(int *type,int sp,int *pReg1,int *pReg2);
+void SetTowTermToReg_Whole32Calc(int *type,int sp,int *pReg1,int *pReg2);
+BOOL Calc_Cast(int *type,LONG_PTR *index_stack,int *pStackPointer);
+
+//Compile_Set_Var.cpp
+BOOL IsUse_r11(RELATIVE_VAR *pRelativeVar);
+void SetObjectVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap);
+void SetDoubleVariable(int type,RELATIVE_VAR *pRelative);
+void SetSingleVariable(int type,RELATIVE_VAR *pRelative);
+void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative);
+
+//increment.cpp
+void IncDec(int idCalc, char *lpszLeft, char *lpszRight);
+
+//calc2.cpp
+#define EXP_TYPE_NUMBER 1
+#define EXP_TYPE_EAX 2
+#define EXP_TYPE_FPU 3
+#define EXP_TYPE_VAR 4
+int NumOpEx(char *Command,double *pDbl,DWORD *pdwType,RELATIVE_VAR *pRelativeVar);
+
+//SetVar.cpp
+BOOL SetVariable(DWORD dwVarType,RELATIVE_VAR *pVarRelativeVar,
+ DWORD dwExpType,DWORD dwType,void *data);
+
+//Compile_Calc_PushVar.cpp
+void SetXmmReg_DoubleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg);
+void SetXmmReg_SingleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg);
+void SetReg_WholeVariable(int type,RELATIVE_VAR *pRelativeVar,int reg);
+
+//Compile_Object.cpp
+int Operator_New(char *Parameter,LONG_PTR *plpIndex);
+void OpcodeDelete(char *Parameter);
+
+//Compile_Var.cpp
+void GetWithName(char *buffer);
+void SetThisPtrToReg(int reg);
+BOOL GetVarOffset(BOOL bError,char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
+BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf);
+#define DIMFLAG_INITDEBUGVAR 1
+#define DIMFLAG_NONCALL_CONSTRACTOR 2
+#define DIMFLAG_STATIC 4
+void OpcodeDim(char *Parameter,DWORD dwFlag);
+void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar);
+
+//CParameter.cpp
+#define OVERLOAD_LEVEL1 1
+#define OVERLOAD_LEVEL2 2
+#define OVERLOAD_LEVEL3 3
+class CParameter{
+ char *Parms[255];
+ TYPEINFO types[255];
+ int ParmsNum;
+
+ TYPEINFO ReturnTypeInfo;
+
+public:
+ CParameter(char *buffer);
+ CParameter(PARAMETER_INFO *pParamInfo,int ParmNum);
+ ~CParameter();
+ void SetReturnType(TYPEINFO *pTypeInfo);
+
+private:
+ BOOL _overload_check(PARAMETER_INFO *ppi,int pi_num,TYPEINFO *pReturnTypeInfo,int overload_level);
+ SUBINFO *OverloadSolutionWithReturnType(char *name,SUBINFO **ppsi,int num);
+public:
+ SUBINFO *OverloadSolution(char *name,SUBINFO **ppsi,int num);
+
+ BOOL ErrorCheck(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
+ void MacroParameterSupport(PARAMETER_INFO *ppi);
+ void SetObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter);
+ void SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
+ void BackupParameter(int pi_num);
+ void RestoreParameter(int pi_num);
+};
+
+//CLockParameter.cpp
+#define MAX_LOCKPARMS 255
+class CDBLockParms{
+public:
+ int array_LevelCount[MAX_LOCKPARMS];
+ CDBLockParms();
+ ~CDBLockParms();
+
+ void lock(int level);
+ void unlock(int level);
+};
+
+//Compile_CallProc.cpp
+void AddLocalVarAddrSchedule();
+int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex);
+BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo);
+#define PROCFLAG_NEW 1
+int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex);
+int Opcode_CallProc(char *Parameter,SUBINFO *psi,LONG_PTR *plpIndex,DWORD dwFlags,char *ObjectName,int RefType);
+int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex);
+
+//Compile_ProcOp.cpp
+void CompileLocal();
+
+//Compile_Func.cpp
+int GetFunctionType(int FuncNum);
+int GetFunctionFromName(char *FuncName);
+int Opcode_CallFunc(char *Parameter,int FuncNum);
+
+//OperatorProc.cpp
+void FreeTempObject(int reg,CClass *pobj_c);
+int CallOperatorProc(int idCalc,TYPEINFO *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
+void CallCastOperatorProc(int reg,int &CalcType,LONG_PTR &lpCalcIndex,BOOL bCalcUseHeap,int ToType,LONG_PTR lpToIndex);
+void CallArrayOperatorProc(int reg,CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo);
+
+//Compile_Statement.cpp
+void OpcodeOthers(char *Command);
+void OpcodeIf(char *Parameter);
+void OpcodeGoto(char *Parameter);
+void OpcodeWhile(char *Parameter);
+void OpcodeExitWhile(void);
+void OpcodeFor(char *Parameter);
+void OpcodeExitFor(void);
+void OpcodeDo(char *Parameter);
+void OpcodeExitDo(void);
+void OpcodeContinue(void);
+void OpcodeExitSub(void);
+void OpcodeSelect(char *Parameter);
+void OpcodeCase(char *Parameter);
+void OpcodeGosub(char *Parameter);
+void OpcodeReturn(char *Parameter);
+void Opcode_Input(char *Parameter);
+void Opcode_Print(char *Parameter,BOOL bWrite);
+void OpcodeCallPtr(char *Parameter);
+void OpcodeSetPtrData(char *Parameter,int type);
+
+
+//InsertOpcode.cpp
+void InsertDimStatement_ToProcHead(char *lpszCommand);
+
+
+
+////////////////////////////////
+// AMD64機械語生成に利用する関数郡
+////////////////////////////////
+
+//Mod(モード)
+#define MOD_BASE (char)0x00
+#define MOD_DISP32 (char)0xFF
+#define MOD_BASE_DISP8 (char)0x40
+#define MOD_BASE_DISP32 (char)0x80
+#define MOD_REG (char)0xC0
+
+#define USE_OFFSET 1
+#define NON_OFFSET 0
+
+//amd64_main.cpp
+BOOL IsSafeReg(int reg);
+void op_push(int reg);
+void op_push_value(long data);
+void op_pop(int reg);
+void op_mov_RV (int op_size,int reg,int i32data);
+void op_mov_RV64 (int reg,_int64 i64data);
+void op_mov_RM (int op_size,int reg,int base_reg,int offset,char mod);
+void op_mov_RM_ex (int op_size,int reg,int base_reg1,int base_reg2,int offset,BOOL bUseOffset);
+void op_mov_MR (int op_size,int reg,int base_reg,int offset,char mod);
+void op_mov_MR_ex (int op_size,int reg,int base_reg1,int base_reg2,int offset,BOOL bUseOffset);
+void op_mov_MV (int op_size,int base_reg,int offset,BOOL bUseOffset,int i32data);
+void op_mov_RR (int reg1,int reg2);
+void op_mov64_ToReg (int reg,_int64 i64data);
+void op_mov64_ToReg (int reg,int i32data);
+void op_mov64_ToReg_FromReg (int reg1,int reg2);
+void op_movsxd (int reg64,int reg32);
+void op_movsx64_FromReg16 (int reg64,int reg16);
+void op_movsx64_FromReg8 (int reg64,int reg8);
+void op_movsx32_FromReg16 (int reg32,int reg16);
+void op_movsx32_FromReg8 (int reg32,int reg8);
+void op_movsx16_FromReg8 (int reg32,int reg8);
+void op_inc (int reg);
+void op_dec (int reg);
+void op_add_RM (int op_size,int reg,int base_reg,int offset,char mod);
+void op_add64_value (int reg,int offset);
+void op_add64_reg (int reg1,int reg2);
+void op_add32_reg (int reg1,int reg2);
+void op_sub_RV (int op_size,int reg,int i32data);
+void op_sub64_reg (int reg1,int reg2);
+void op_sub32_reg (int reg1,int reg2);
+void op_imul_reg (int op_size,int reg1,int reg2);
+void op_imul_value (int op_size,int reg,int i32data);
+void op_div64_reg (int reg);
+void op_idiv64_reg (int reg);
+void op_shl_reg (int op_size,int reg);
+void op_sar_reg (int op_size,int reg);
+void op_shr_reg (int op_size,int reg);
+void op_and_reg (int op_size,int reg1,int reg2);
+void op_and64_value (int reg,int offset);
+void op_and32_value (int reg,int offset);
+void op_or_reg (int op_size,int reg1,int reg2);
+void op_xor_reg (int op_size,int reg1,int reg2);
+void op_not_reg (int op_size,int reg);
+void op_test (int reg1,int reg2);
+void op_cmp_reg (int op_size,int reg1,int reg2);
+void op_cmp_value (int op_size,int reg,char byte_data);
+void op_movlpd_MR (int xmm_reg,int base_reg,int offset,char mod);
+void op_movlpd_RM (int xmm_reg,int base_reg,int offset,char mod);
+void op_movsd_RR (int xmm_reg1,int xmm_reg2);
+void op_movsd_MR (int xmm_reg,int base_reg,int offset,char mod);
+void op_movss_RR (int xmm_reg1,int xmm_reg2);
+void op_movss_RM (int xmm_reg,int base_reg,int offset,char mod);
+void op_movss_MR (int xmm_reg,int base_reg,int offset,char mod);
+void op_movd_RX (int reg,int xmm_reg);
+void op_cvtsd2ss (int xmm_reg1,int xmm_reg2);
+void op_cvtss2sd (int xmm_reg1,int xmm_reg2);
+void op_cvttsd2si_xmm (int op_size,int reg,int xmm_reg);
+void op_cvttss2si_xmm (int op_size,int reg,int xmm_reg);
+void op_cvtsi2sd_reg (int op_size,int xmm_reg,int reg);
+void op_cvtsi2ss_reg (int op_size,int xmm_reg,int reg);
+void op_comisd (int xmm_reg1,int xmm_reg2);
+void op_comiss (int xmm_reg1,int xmm_reg2);
+void op_rep_movs (int op_size);
+void op_add_rsp(int num);
+void op_sub_rsp(int num);
+void op_add_esp(int num);
+void op_sub_esp(int num);
+void op_fld_ptr_esp(int type);
+void op_zero_reg(int reg);
+void op_call(SUBINFO *psi);
Index: /BasicCompiler64/OperatorProc.cpp
===================================================================
--- /BasicCompiler64/OperatorProc.cpp (revision 3)
+++ /BasicCompiler64/OperatorProc.cpp (revision 3)
@@ -0,0 +1,475 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void FreeTempObject(int reg,CClass *pobj_c){
+ if(!IsSafeReg(reg)) SetError(300,NULL,cp);
+
+ ////////////////////////////////////////////////
+ // 演算過程で利用した一時オブジェクトを破棄
+ // Thisポインタをr14レジスタを介して渡す
+ ////////////////////////////////////////////////
+
+ if(pobj_c->DestructorMemberSubIndex!=-1){
+ //mov rcx,reg
+ op_mov_RR(REG_RCX,reg);
+
+ //call DestructorProcAddr
+ op_call(pobj_c->ppobj_Method[pobj_c->DestructorMemberSubIndex]->psi);
+ }
+
+ //mov rcx,reg
+ op_mov_RR(REG_RCX,reg);
+
+ //call free
+ extern SUBINFO *pSub_free;
+ op_call(pSub_free);
+}
+
+int CallOperatorProc(int idCalc,TYPEINFO *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
+ //オーバーロードされたオペレータ関数を呼び出す
+ CClass *pobj_c;
+ pobj_c=(CClass *)index_stack[sp-2];
+
+ SUBINFO **ppsi;
+ int num;
+ ppsi=pobj_c->GetOperatorSubInfo(idCalc,num);
+ if(num==0){
+ HeapDefaultFree(ppsi);
+
+ return 0;
+ }
+
+
+ //項の数
+ BOOL bTwoTerm=1;
+ if(idCalc==CALC_AS) bTwoTerm=0;
+
+
+ int i;
+ BOOL bReturnTypeIsObject=1;
+ TYPEINFO ReturnType={DEF_OBJECT,ppsi[0]->u.ReturnIndex};
+ for(i=0;iReturnType!=DEF_OBJECT)
+ bReturnTypeIsObject=0;
+ }
+
+ if(bReturnTypeIsObject==0){
+ if(pBaseTypeInfo){
+ if(pBaseTypeInfo->type==DEF_OBJECT){
+ bReturnTypeIsObject=1;
+ ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex;
+ }
+ }
+ }
+
+
+
+ /////////////////////////////////////////////
+ // オーバーロード解決用のパラメータを設定
+ /////////////////////////////////////////////
+
+ PARAMETER_INFO *ppi;
+ int iParmNum=0;
+
+ //_System_LocalThis
+ ppi=(PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
+ ppi[iParmNum].bArray=0;
+ ppi[iParmNum].bByVal=0;
+ ppi[iParmNum].name=0;
+ ppi[iParmNum].type=DEF_PTR_VOID;
+ ppi[iParmNum].u.index=-1;
+ ppi[iParmNum].SubScripts[0]=-1;
+ iParmNum++;
+
+ if(bTwoTerm){
+ ppi[iParmNum].bArray=0;
+ ppi[iParmNum].bByVal=0;
+ ppi[iParmNum].name=0;
+ ppi[iParmNum].type=type[sp-1];
+ ppi[iParmNum].u.index=index_stack[sp-1];
+ ppi[iParmNum].SubScripts[0]=-1;
+ iParmNum++;
+ }
+
+
+ //オーバーロードを解決
+ char temporary[255];
+ if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
+ else GetCalcName(idCalc,temporary);
+ SUBINFO *psi;
+ psi=OverloadSolution(temporary,ppsi,num,ppi,iParmNum,pBaseTypeInfo);
+ HeapDefaultFree(ppsi);
+
+ if(!psi){
+ HeapDefaultFree(ppi);
+ return -1;
+ }
+ else{
+ //オーバーロードされていないが、パラメータ個数が一致しないとき
+ if(iParmNum!=psi->ParmNum){
+ HeapDefaultFree(ppi);
+ return -1;
+ }
+ }
+
+ for(i=0;ipParmInfo[i].type,
+ psi->pParmInfo[i].u.index,
+ ppi[i].type,
+ ppi[i].u.index,
+ "",
+ i);
+ }
+
+ HeapDefaultFree(ppi);
+
+ int right_side_size;
+ if(type[sp-1]==DEF_OBJECT) right_side_size=PTR_SIZE;
+ else right_side_size=GetTypeSize(type[sp-1],index_stack[sp-1]);
+
+ if(bTwoTerm){
+ if(psi->pParmInfo[1].type==DEF_OBJECT&&psi->pParmInfo[1].bByVal){
+ //一時オブジェクトはメソッド内で破棄される
+ bUseHeap[sp-1]=0;
+ }
+ }
+
+
+ if(psi->ReturnType==DEF_OBJECT){
+ //////////////////////////////////////////////////////
+ // 戻り値にオブジェクト インスタンスを持つ場合
+ // ※ByRef _System_ReturnObject パラメータ用領域を取得
+ //////////////////////////////////////////////////////
+
+
+ //////////////////////////////////////////////////////
+ ///// レジスタ資源のバックアップ
+ { BACKUP_REGISTER_RESOURCE
+ //////////////////////////////////////////////////////
+
+ int object_size;
+ object_size=GetSizeOfClass(psi->u.Return_pobj_c);
+
+ //mov rcx,object_size
+ op_mov_RV(sizeof(_int64),REG_RCX,object_size);
+
+ //call calloc
+ extern SUBINFO *pSub_calloc;
+ op_call(pSub_calloc);
+
+ //mov r13,rax
+ op_mov_RR(REG_R13,REG_RAX);
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+ }
+
+
+ int reg1,reg2;
+ if(bTwoTerm){
+ //右の項(実数の場合が未完成)
+ SetOneTermToReg_Whole64Calc(type[sp-1],®2);
+ pobj_reg->UnlockReg();
+ }
+
+ //左の項
+ SetOneTermToReg_Whole64Calc(DEF_INT64,®1);
+ pobj_reg->UnlockReg();
+
+ //ヒープ解放用に退避
+ if(bUseHeap[sp-1]){
+ //mov qword ptr[rsp+offset],reg2 ※スタックフレームを利用
+ pobj_sf->push(reg2);
+ }
+ if(bUseHeap[sp-2]){
+ //mov qword ptr[rsp+offset],reg1 ※スタックフレームを利用
+ pobj_sf->push(reg1);
+ }
+
+
+
+ //////////////////////////////////////////////////////
+ ///// レジスタ資源のバックアップ
+ { BACKUP_REGISTER_RESOURCE
+ //////////////////////////////////////////////////////
+
+ if(reg1==REG_RDX||reg1==REG_R8){
+ //mov r14,reg1
+ op_mov_RR(REG_R14,reg1);
+ reg1=REG_R14;
+ }
+
+
+ if(bTwoTerm){
+ if(psi->ReturnType==DEF_OBJECT){
+ //mov r8,reg2
+ op_mov_RR(REG_R8,reg2);
+ }
+ else{
+ //mov rdx,reg2
+ op_mov_RR(REG_RDX,reg2);
+ }
+ }
+
+ if(psi->ReturnType==DEF_OBJECT){
+ //mov rdx,r13
+ op_mov_RR(REG_RDX,REG_R13);
+ }
+
+ //mov rcx,reg1
+ op_mov_RR(REG_RCX,reg1);
+
+ //call operator_proc
+ op_call(psi);
+
+ if(psi->ReturnType!=-1){
+ //戻り値を一時的に退避
+
+ //mov r13,rax
+ op_mov_RR(REG_R13,REG_RAX);
+ }
+
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+
+
+
+ if(bUseHeap[sp-2]||bUseHeap[sp-1]){
+
+ //////////////////////////////////////////////////////
+ ///// レジスタ資源のバックアップ
+ { BACKUP_REGISTER_RESOURCE
+ //////////////////////////////////////////////////////
+
+ if(bUseHeap[sp-2]){
+ //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R14);
+
+ FreeTempObject(REG_R14,(CClass *)index_stack[sp-2]);
+ }
+ if(bUseHeap[sp-1]){
+ //mov r14,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R14);
+
+ FreeTempObject(REG_R14,(CClass *)index_stack[sp-1]);
+ }
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+ }
+
+ if(psi->ReturnType!=-1){
+ //戻り値をreg1にセット
+ reg1=pobj_reg->LockReg();
+
+ //mov reg1,r13
+ op_mov_RR(reg1,REG_R13);
+ }
+
+ sp--;
+ type[sp-1]=psi->ReturnType;
+ index_stack[sp-1]=psi->u.ReturnIndex;
+
+ if(psi->ReturnType==DEF_OBJECT){
+ //Object型が戻ったときはヒープ領域にインスタンスが格納されている
+ //※後にfreeする必要あり
+ bUseHeap[sp-1]=1;
+ }
+ else bUseHeap[sp-1]=0;
+
+ return 1;
+}
+
+void CallCastOperatorProc(int reg,int &CalcType,LONG_PTR &lpCalcIndex,BOOL bCalcUseHeap,int ToType,LONG_PTR lpToIndex){
+ int type[10];
+ LONG_PTR index_stack[10];
+ BOOL array_bUseHeap[10];
+ int sp=2;
+ int iRet;
+
+
+ //////////////////////////////////////////////////////
+ ///// レジスタ資源のバックアップ
+ { BACKUP_REGISTER_RESOURCE
+ //////////////////////////////////////////////////////
+
+ //regを第一項目としてロック
+ pobj_reg=new CRegister(reg);
+ pobj_reg->LockReg();
+
+ if(bCalcUseHeap){
+ /*
+ //未解放のインスタンスが存在する場合
+ //※専用のローカル変数を用意し、メモリリークを回避
+ char temporary[VN_SIZE],temp2[VN_SIZE];
+
+
+ ////////////////////////////////
+ // 一時オブジェクト変数を用意
+ ////////////////////////////////
+ char szTempVarName[255];
+ GetTypeName(CalcType,lpCalcIndex,temp2);
+ sprintf(szTempVarName,"_System_strDummy%d",obp);
+ wsprintf(temporary,"%s%c%c%s",szTempVarName,1,ESC_AS,temp2);
+ InsertDimStatement_ToProcHead(temporary);
+
+ RELATIVE_VAR VarRelativeVar;
+ int VarType;
+ LONG_PTR lpVarIndex;
+ if(!GetVarOffset(
+ 1,
+ szTempVarName,
+ &VarType,
+ &VarRelativeVar,
+ &lpVarIndex)) return;
+
+
+ CClass *pobj_c;
+ pobj_c=(CClass *)lpCalcIndex;
+ if(pobj_c->DestructorMemberSubIndex!=-1){
+
+ //////////////////////////////////////////////////////
+ ///// レジスタ資源のバックアップ
+ { BACKUP_REGISTER_RESOURCE
+ //////////////////////////////////////////////////////
+
+ //ループの場合、古い一時オブジェクトのデストラクタを呼ぶ
+
+ //rcxに変数アドレスをコピー
+ SetVarPtrToReg(REG_RCX,&VarRelativeVar);
+
+ //call destructor
+ OpBuffer[obp++]=(char)0xE8;
+ pobj_SubAddrSchedule->add(pobj_c->ppobj_Method[pobj_c->DestructorMemberSubIndex]->psi,1);
+ obp+=sizeof(long);
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+ }
+
+ //mov r15,reg
+ op_mov_RR(REG_R15,reg);
+
+
+ int object_size;
+ object_size=GetSizeOfClass((CClass *)lpVarIndex);
+
+ //mov rcx,object_size
+ op_mov_RV(sizeof(_int64),REG_RCX,object_size);
+
+ //rdiに変数アドレスをコピー
+ SetVarPtrToReg(REG_RDI,&VarRelativeVar);
+
+ //mov rsi,reg
+ op_mov_RR(REG_RSI,reg);
+
+ //mov r14,rdi
+ op_mov_RR(REG_R14,REG_RDI);
+ pobj_BlockReg->lock(REG_R14);
+
+ //rep movs byte ptr[rdi],byte ptr[rsi]
+ op_rep_movs(sizeof(BYTE));
+
+ //////////////////////////////////////////////////////
+ ///// レジスタ資源のバックアップ
+ { BACKUP_REGISTER_RESOURCE
+ //////////////////////////////////////////////////////
+
+ //mov rcx,r15
+ op_mov_RR(REG_RCX,REG_R15);
+
+ //call free
+ extern SUBINFO *pSub_free;
+ OpBuffer[obp++]=(char)0xE8;
+ pobj_SubAddrSchedule->add(pSub_free,1);
+ obp+=sizeof(long);
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+
+
+ //mov reg,r14
+ op_mov_RR(reg,REG_R14);
+
+ pobj_BlockReg->unlock(REG_R14);
+ */
+
+ //未解放のインスタンスが存在する旨を示す警告
+ SetError(-105,NULL,cp);
+
+ }
+
+ //左辺
+ type[0]=CalcType;
+ index_stack[0]=lpCalcIndex;
+ array_bUseHeap[0]=0;
+ type[1]=ToType;
+ index_stack[1]=lpToIndex;
+ array_bUseHeap[1]=0;
+
+ TYPEINFO BaseTypeInfo={ToType,lpToIndex};
+
+ iRet=CallOperatorProc(CALC_AS,&BaseTypeInfo,type,index_stack,array_bUseHeap,sp);
+
+ pobj_reg->UnlockReg();
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+
+
+ if(iRet==1){
+ //成功したとき
+ CalcType=type[0];
+ lpCalcIndex=index_stack[0];
+ return;
+ }
+ else if(iRet==-1){
+ //エラーが発行されたとき
+ return;
+ }
+
+ //エラーを発行
+ SetError(-1,"キャスト演算子がオーバーロードされていません。",cp);
+}
+
+void CallArrayOperatorProc(int reg,CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo){
+ SUBINFO **ppsi;
+ int num;
+ ppsi=pobj_Class->GetOperatorSubInfo(CALC_ARRAY_GET,num);
+ if(num==0){
+ HeapDefaultFree(ppsi);
+
+ return;
+ }
+
+ //////////////////////////////////////////////////////
+ ///// レジスタ資源のバックアップ
+ { BACKUP_REGISTER_RESOURCE
+ //////////////////////////////////////////////////////
+
+ RetTypeInfo.type=Opcode_CallProc(Parameter,ppsi[0],&RetTypeInfo.u.lpIndex,0,ObjectName,DEF_OBJECT);
+
+ //mov reg,rax
+ op_mov_RR(reg,REG_RAX);
+
+ /////////////////////////////////////////////
+ ////// レジスタ資源を復元
+ RESTORE_REGISTER_RESOURCE
+ }////////////////////////////////////////////
+
+ HeapDefaultFree(ppsi);
+}
Index: /BasicCompiler64/Register.cpp
===================================================================
--- /BasicCompiler64/Register.cpp (revision 3)
+++ /BasicCompiler64/Register.cpp (revision 3)
@@ -0,0 +1,290 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+//エラー用
+extern int cp;
+
+
+////////////////////////////
+// レジスタのブロッキング
+////////////////////////////
+
+CBlockReg *pobj_BlockReg;
+
+CBlockReg::CBlockReg(){
+ num=0;
+}
+void CBlockReg::lock(int reg){
+ if(check(reg)){
+ SetError(300,NULL,cp);
+ }
+ array_BlockReg[num++]=reg;
+}
+void CBlockReg::unlock(int reg){
+ int i;
+ for(i=0;i=0;i--){
+ if(IS_XMM_REG(array_BlockReg[i])){
+ //movlpd qword ptr[rsp+offset],xmm_reg ※スタックフレームを利用
+ pobj_sf->push(array_BlockReg[i],sizeof(double));
+ }
+ else{
+ //mov qword ptr[rsp+offset],reg ※スタックフレームを利用
+ pobj_sf->push(array_BlockReg[i]);
+ }
+ }
+}
+void CBlockReg::restore(){
+ int i;
+
+ for(i=0;ipop(array_BlockReg[i],sizeof(double));
+ }
+ else{
+ //mov reg,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(array_BlockReg[i]);
+ }
+ }
+}
+
+
+///////////////////
+// レジスタ管理
+///////////////////
+
+const int CalculationRegister[]={
+ REG_RAX,
+ REG_RCX,
+ REG_RDX,
+ REG_RBX,
+ REG_RSI,
+ REG_RDI,
+ REG_R8,
+ REG_R9,
+ REG_R10
+};
+
+const int CalculationXmmRegister[]={
+ REG_XMM0,
+ REG_XMM1,
+ REG_XMM2,
+ REG_XMM3,
+ /*XMM4、XMM5は演算時に一時的に利用*/
+/* REG_XMM6,
+ REG_XMM7,
+ REG_XMM8,
+ REG_XMM9,
+ REG_XMM10,
+ REG_XMM11,
+ REG_XMM12,
+ REG_XMM13,
+ REG_XMM14,
+ REG_XMM15 関数呼び出し時のレジスタ保持を未搭載のため、保留*/
+};
+
+CRegister *pobj_reg;
+
+void CRegister::EnumRegister(int *pRegList,int nMaxList,int *array_reg,int *sp,int AnswerReg){
+ int i,i2,sw=0;
+
+ i2=nMaxList-1;
+ for(i=0;i2>=0;i++,i2--){
+ if(AnswerReg==pRegList[i2]){
+ sw=1;
+ i--;
+ continue;
+ }
+
+ if(pobj_BlockReg->check(pRegList[i2])){
+ //レジスタがブロッキングされているとき
+ i--;
+ continue;
+ }
+
+ array_reg[i]=pRegList[i2];
+ }
+
+ if(sw){
+ array_reg[i++]=AnswerReg;
+
+ //エラーチェック
+ if(pobj_BlockReg->check(AnswerReg)) SetError(300,NULL,cp);
+ }
+
+ *sp=i-1;
+}
+
+CRegister::CRegister(int AnswerReg){
+ /* 例: AnswerReg=REG_RCX ※REG_RCXをスタックの最後尾へセット
+ ※r15、r14は一時保存用として利用する
+ ※r13は同一関数内の単発処理用の一時保存レジスタとして利用する
+ ※r12、r11は配列計算用として利用する
+ array_UseReg[0]=REG_R10
+ array_UseReg[1]=REG_R9
+ array_UseReg[2]=REG_R8
+ array_UseReg[3]=REG_RBX
+ array_UseReg[4]=REG_RDX
+ array_UseReg[5]=REG_RAX
+ array_UseReg[6]=REG_RCX */
+
+
+ ///////////////////////////////////////////////////////////
+ //array_UseRegに、計算に利用するレジスタリストを作成
+ ///////////////////////////////////////////////////////////
+
+ EnumRegister(
+ (int *)CalculationRegister,
+ sizeof(CalculationRegister)/sizeof(int),
+ array_UseReg,
+ &sp_UseReg,
+ AnswerReg);
+
+
+
+ ///////////////////////////////////////////////////////////
+ //array_XmmRegに、計算に利用するレジスタリストを作成
+ ///////////////////////////////////////////////////////////
+
+ EnumRegister(
+ (int *)CalculationXmmRegister,
+ sizeof(CalculationXmmRegister)/sizeof(int),
+ array_XmmReg,
+ &sp_XmmReg,
+ AnswerReg);
+
+
+ init_sp_reg=sp_UseReg;
+ init_sp_xmm_reg=sp_XmmReg;
+}
+void CRegister::bug_check(){
+ if(init_sp_reg!=sp_UseReg||
+ init_sp_xmm_reg!=sp_XmmReg) SetError(300,NULL,cp);
+}
+int CRegister::GetNextReg(){
+ if(sp_UseReg<0) return REG_R14;
+ return array_UseReg[sp_UseReg];
+}
+int CRegister::GetLockingReg(){
+ UnlockReg();
+ return LockReg();
+}
+int CRegister::LockReg(){
+ int reg;
+ reg=GetNextReg();
+
+ sp_UseReg--;
+
+ return reg;
+}
+int CRegister::UnlockReg(){
+ sp_UseReg++;
+ return GetNextReg();
+}
+int CRegister::GetNextXmmReg(){
+ if(sp_XmmReg<0) return REG_XMM4;
+ return array_XmmReg[sp_XmmReg];
+}
+int CRegister::GetLockingXmmReg(){
+ UnlockXmmReg();
+ return LockXmmReg();
+}
+int CRegister::LockXmmReg(){
+ int xmm_reg;
+ xmm_reg=GetNextXmmReg();
+
+ sp_XmmReg--;
+
+ return xmm_reg;
+}
+int CRegister::UnlockXmmReg(){
+ sp_XmmReg++;
+ return GetNextXmmReg();
+}
+void CRegister::backup(){
+ int i;
+
+ //汎用レジスタを退避
+ for(i=init_sp_reg;i>sp_UseReg;i--){
+ //mov qword ptr[rsp+offset],reg ※スタックフレームを利用
+ pobj_sf->push(array_UseReg[i]);
+ }
+
+ //XMMレジスタを退避
+ for(i=init_sp_xmm_reg;i>sp_XmmReg;i--){
+ //mov qword ptr[rsp+offset],reg ※スタックフレームを利用
+ pobj_sf->push(array_XmmReg[i],sizeof(_int64));
+ }
+}
+void CRegister::restore(){
+ int i;
+
+ //XMMレジスタを復元
+ if(sp_XmmReg<0) i=0;
+ else i=sp_XmmReg+1;
+ for(;i<=init_sp_xmm_reg;i++){
+ //mov reg,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(array_XmmReg[i],sizeof(_int64));
+ }
+
+ //汎用レジスタを復元
+ if(sp_UseReg<0) i=0;
+ else i=sp_UseReg+1;
+ for(;i<=init_sp_reg;i++){
+ //mov reg,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(array_UseReg[i]);
+ }
+}
+
+
+
+////////////////////////
+// その他
+////////////////////////
+
+BOOL IsGeneralReg(int reg){
+ if(REG_RAX<=reg&®<=REG_R15) return 1;
+ return 0;
+}
+BOOL IsXmmReg(int reg){
+ if(REG_XMM0<=reg&®<=REG_XMM15) return 1;
+ return 0;
+}
+BOOL IsVolatileReg(int reg){
+ if(reg==REG_RAX||
+ reg==REG_RCX||
+ reg==REG_RDX||
+ REG_R8<=reg&®<=REG_R11||
+ REG_XMM0<=reg&®<=REG_XMM5){
+ //値を保持する必要なし
+ return 1;
+ }
+ else{
+ //値を保持する必要あり
+ return 0;
+ }
+}
Index: /BasicCompiler64/WatchList.cpp
===================================================================
--- /BasicCompiler64/WatchList.cpp (revision 3)
+++ /BasicCompiler64/WatchList.cpp (revision 3)
@@ -0,0 +1,534 @@
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+//デバッグ用
+#include "../BasicCompiler_Common/debug.h"
+
+int Debugging_GetArray(int *SubScripts,char *array,int type,LONG_PTR lpIndex,LONG_PTR *plpOffset);
+
+ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar){
+ extern DWORD ImageBase;
+ extern int MemPos_RWSection;
+ int i2;
+
+ if(pRelativeVar->dwKind==VAR_GLOBAL){
+ return ImageBase+MemPos_RWSection+pRelativeVar->offset;
+ }
+ else if(pRelativeVar->dwKind==VAR_LOCAL){
+ extern HWND hDebugWnd;
+ i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+ i2=pobj_dti->iProcLevel-i2;
+
+ if(pobj_dti->lplpSpBase[i2]==0) return 0;
+
+ return pobj_dti->lplpSpBase[i2]+pRelativeVar->offset;
+ }
+ else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+ extern HWND hDebugWnd;
+ i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+ i2=pobj_dti->iProcLevel-i2;
+
+ if(pobj_dti->lplpSpBase[i2]==0) return 0;
+
+ extern HANDLE hDebugProcess;
+ LONG_PTR lpData;
+ SIZE_T stAccBytes;
+ ReadProcessMemory(hDebugProcess,
+ (void *)(pobj_dti->lplpSpBase[i2]+(int)pRelativeVar->offset),
+ &lpData,
+ sizeof(LONG_PTR),
+ &stAccBytes);
+
+ return lpData;
+ }
+ else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+ return pRelativeVar->offset;
+ }
+
+ return 0;
+}
+
+BOOL Debugging_SetRelativeOffset(int *pType,LONG_PTR lpIndex,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
+ int array_num;
+
+ _int64 i64data;
+ int type;
+ type=StaticCalculation(true, lpPtrOffset,0,&i64data,0,1);
+ if(!type) return 0;
+ if(IsRealNumberType(type)){
+ double dbl;
+ memcpy(&dbl,&i64data,sizeof(double));
+ i64data=(_int64)dbl;
+ }
+
+ array_num=(int)i64data;
+
+ if(PTR_LEVEL(*pType)){
+ *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1);
+ if((*pType)==DEF_OBJECT)
+ array_num*=GetSizeOfClassMember((CClass *)lpIndex,NULL,NULL);
+ else
+ array_num*=GetTypeSize(*pType,-1);
+ }
+ else{
+ //エラー
+ return 0;
+ }
+
+ extern HANDLE hDebugProcess;
+ LONG_PTR lpData;
+ SIZE_T stAccBytes;
+ lpData=Debugging_GetVarPtr(pRelativeVar);
+ if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) return 0;
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ pRelativeVar->offset+=array_num;
+ return 1;
+}
+
+BOOL Debugging_GetMember(CClass *pobj_c,char *member,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpNestIndex,BOOL bPrivateAccess){
+ int i,i2,offset;
+
+ //直接参照に切り替え
+ pRelativeVar->offset=(LONG_PTR)Debugging_GetVarPtr(pRelativeVar);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ //クラス、配列の構成要素を解析する
+ char VarName[VN_SIZE]; //変数名
+ char array[VN_SIZE]; //第1次配列
+ char lpPtrOffset[VN_SIZE]; //第2次配列
+ char NestMember[VN_SIZE]; //入れ子メンバ
+ int RefType; //"."参照のときは0、"->"参照のときは1
+ lstrcpy(VarName,member);
+ if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
+
+
+ ////////////////////////////
+ // メンバオフセットを取得
+ ////////////////////////////
+
+ offset=GetSizeOfClassMember(pobj_c,VarName,&i);
+ if(i==pobj_c->iMemberNum) return 0;
+
+
+ //アクセシビリティをチェック
+ if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
+ pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
+ return 0;
+ }
+ else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED)
+ return 0;
+
+ *pType=pobj_c->ppobj_Member[i]->TypeInfo.type;
+ *plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
+
+ //ポインタ変数の場合
+ if(IsPtrType(*pType)){
+ if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
+ lstrcpy(lpPtrOffset,array);
+ array[0]=0;
+ }
+ }
+ else{
+ if(lpPtrOffset[0]) return 0;
+ }
+
+ pRelativeVar->offset+=offset;
+
+ if(array[0]){
+ //配列オフセット
+ i2=Debugging_GetArray(
+ pobj_c->ppobj_Member[i]->SubScripts,
+ array,
+ *pType,
+ pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex,
+ &pRelativeVar->offset);
+ if(i2==0){
+ //式エラー
+ return 0;
+ }
+ if(i2==-1){
+ //アクセスエラー
+ return -1;
+ }
+ }
+ else if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
+ *pType|=FLAG_PTR;
+ }
+
+ if(NestMember[0]){
+ //入れ子構造の場合
+
+ if(*pType==DEF_OBJECT){
+ if(RefType!=DEF_OBJECT) return 0;
+ }
+ else if(*pType==DEF_PTR_OBJECT){
+ //構造体ポインタ型メンバ変数
+
+ if(lpPtrOffset[0]){
+ if(RefType!=DEF_OBJECT) return 0;
+
+ //直接参照に切り替え
+ Debugging_SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
+
+ lpPtrOffset[0]=0;
+ }
+ else{
+ if(RefType!=DEF_PTR_OBJECT) return 0;
+
+ extern HANDLE hDebugProcess;
+ LONG_PTR lpData;
+ SIZE_T stAccBytes;
+ lpData=Debugging_GetVarPtr(pRelativeVar);
+ if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) return -1;
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+ }
+ }
+
+ i2=Debugging_GetMember(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
+ NestMember,
+ pType,
+ pRelativeVar,
+ plpNestIndex,
+ 0);
+ if(i2==0){
+ //式エラー
+ return 0;
+ }
+ if(i2==-1){
+ //アクセスエラー
+ return -1;
+ }
+ }
+
+ if(lpPtrOffset[0]){
+ Debugging_SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
+ }
+
+ return 1;
+}
+int Debugging_GetArray(int *SubScripts,char *array,int type,LONG_PTR lpIndex,LONG_PTR *plpOffset){
+ extern HANDLE hHeap;
+ int i,i2,i3,i4,i5,array_offset,TypeSize;
+ char temporary[VN_SIZE],*pParm[MAX_PARMS];
+
+ for(i=0,i2=0,i3=0;;i++,i2++){
+ if(array[i]=='('){
+ i4=GetStringInPare(temporary+i2,array+i);
+ i+=i4-1;
+ i2+=i4-1;
+ continue;
+ }
+ if(array[i]=='['){
+ i4=GetStringInBracket(temporary+i2,array+i);
+ i+=i4-1;
+ i2+=i4-1;
+ continue;
+ }
+ if(array[i]==','||array[i]=='\0'){
+ if(SubScripts[i3]==-1){
+ for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+ return 0;
+ }
+
+ temporary[i2]=0;
+
+ pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+ lstrcpy(pParm[i3],temporary);
+
+ i3++;
+
+ if(array[i]=='\0'){
+ if(SubScripts[i3]!=-1){
+ for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+ return 0;
+ }
+ break;
+ }
+
+ i2=-1;
+ continue;
+ }
+ temporary[i2]=array[i];
+ }
+
+ array_offset=0;
+
+ for(i=i3-1;i>=0;i--){
+ _int64 i64data;
+ i2=StaticCalculation(true, pParm[i],0,&i64data,0,1);
+ if(i2==0){
+ //式エラー
+ return 0;
+ }
+ if(i2==-1){
+ //アクセスエラー
+ return -1;
+ }
+
+ if(IsRealNumberType(i2)){
+ double dbl;
+ memcpy(&dbl,&i64data,sizeof(double));
+ i64data=(_int64)dbl;
+ }
+ i5=(int)i64data;
+
+ for(i2=i+1,i4=1;i2VarNum;i++){
+ if(lstrcmp(psi->pVar[i].name,"_System_LocalThis")==0) break;
+ }
+ if(i==psi->VarNum) return 0;
+
+ return psi->pVar[i].offset;
+}
+int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
+ extern HANDLE hDebugProcess;
+ int i,i2,i3,RefType;
+ char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
+ LONG_PTR lpData;
+ SIZE_T stAccBytes;
+
+ lstrcpy(VarName,variable);
+ GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType);
+
+ LONG_PTR lpIndex;
+ int *pSubScripts;
+ BOOL bArray;
+
+
+ /////////////////
+ // ローカル変数
+ /////////////////
+ extern VARIABLE *LocalVar;
+ extern int MaxLocalVarNum;
+ for(i=0;ioffset=LocalVar[i].offset;
+ if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL;
+ else pRelativeVar->dwKind=VAR_LOCAL;
+ *pType=LocalVar[i].type;
+ lpIndex=LocalVar[i].u.index;
+ *plpIndex=lpIndex;
+ bArray=LocalVar[i].bArray;
+ pSubScripts=LocalVar[i].SubScripts;
+ }
+ else{
+ if(pobj_CompilingClass){
+ ///////////////////////
+ // クラスメンバの参照
+ ///////////////////////
+
+ if(memicmp(variable,"This.",5)==0){
+ //Thisオブジェクトのメンバを参照するとき
+ SlideString(variable+5,-5);
+ lstrcpy(VarName,variable);
+ }
+ else{
+ //クラス内メンバを参照するとき(通常)
+
+ for(i=0;iiMemberNum;i++){
+ if(lstrcmp(VarName,pobj_CompilingClass->ppobj_Member[i]->name)==0) break;
+ }
+ if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
+ }
+
+ /////////////////////////////
+ // thisポインタを取得
+
+ extern HWND hDebugWnd;
+ i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+ i2=pobj_dti->iProcLevel-i2;
+
+ lpData=Debugging_GetThisPtrOffset(pobj_dti->lplpObp[i2]);
+ if(!lpData){
+ //式エラー
+ return 0;
+ }
+ lpData+=pobj_dti->lplpSpBase[i2];
+ if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)){
+ //メモリにアクセスできないとき
+ return -1;
+ }
+
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ LONG_PTR lp2;
+ i3=Debugging_GetMember(pobj_CompilingClass,variable,pType,pRelativeVar,&lp2,1);
+ if(i3==0){
+ //式エラー
+ return 0;
+ }
+ if(i3==-1){
+ //アクセスエラー
+ return -1;
+ }
+
+ *plpIndex=lp2;
+ return 1;
+ }
+
+NonClassMember:
+
+ ///////////////////
+ // グローバル変数
+ ///////////////////
+ extern VARIABLE *GlobalVar;
+ extern int MaxGlobalVarNum;
+
+ for(i=0;ioffset=GlobalVar[i].offset;
+ pRelativeVar->dwKind=VAR_GLOBAL;
+ *pType=GlobalVar[i].type;
+ lpIndex=GlobalVar[i].u.index;
+ *plpIndex=lpIndex;
+ bArray=GlobalVar[i].bArray;
+ pSubScripts=GlobalVar[i].SubScripts;
+ }
+
+
+ if(array[0]==0&&bArray){
+ //配列の先頭ポインタを示す場合
+ *pType|=FLAG_PTR;
+ if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
+ return 1;
+ }
+
+ if(array[0]){
+ i3=Debugging_GetArray(pSubScripts,array,*pType,lpIndex,&pRelativeVar->offset);
+ if(i3==0){
+ //式エラー
+ return 0;
+ }
+ if(i3==-1){
+ //アクセスエラー
+ return -1;
+ }
+ }
+ if(member[0]){
+ if(*pType==DEF_OBJECT){
+ //実態オブジェクトのメンバを参照(obj.member)
+ if(RefType!=DEF_OBJECT){
+ return 0;
+ }
+
+ LONG_PTR lp2;
+ i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
+ if(i3==0){
+ //式エラー
+ return 0;
+ }
+ if(i3==-1){
+ //アクセスエラー
+ return -1;
+ }
+
+ *plpIndex=lp2;
+ }
+ else if(*pType==DEF_PTR_OBJECT){
+ //ポインタオブジェクトが示すメンバを参照
+ if(lpPtrOffset[0]){
+ //pObj[n].member
+ if(RefType!=DEF_OBJECT) return 0;
+ Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
+
+ LONG_PTR lp2;
+ i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
+ if(i3==0){
+ //式エラー
+ return 0;
+ }
+ if(i3==-1){
+ //アクセスエラー
+ return -1;
+ }
+
+ *plpIndex=lp2;
+ }
+ else{
+ //pObj->member
+ if(RefType!=DEF_PTR_OBJECT) return 0;
+
+ pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
+ pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+ if(!ReadProcessMemory(hDebugProcess,(void *)pRelativeVar->offset,&lpData,sizeof(LONG_PTR),&stAccBytes)) return -1;
+ pRelativeVar->offset=lpData;
+
+ LONG_PTR lp2;
+ i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
+ if(i3==0){
+ //式エラー
+ return 0;
+ }
+ if(i3==-1){
+ //アクセスエラー
+ return -1;
+ }
+
+ *plpIndex=lp2;
+ }
+ }
+ else{
+ return 0;
+ }
+ return 1;
+ }
+
+ if(lpPtrOffset[0]){
+ if(!Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset)) return 0;
+ }
+
+ return 1;
+}
Index: /BasicCompiler64/amd64_main.cpp
===================================================================
--- /BasicCompiler64/amd64_main.cpp (revision 3)
+++ /BasicCompiler64/amd64_main.cpp (revision 3)
@@ -0,0 +1,1772 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+BOOL IsSafeReg(int reg){
+ switch(reg){
+ case REG_RBX:
+ case REG_RSI:
+ case REG_RDI:
+ case REG_R12:
+ case REG_R13:
+ case REG_R14:
+ case REG_R15:
+ return 1;
+ default:
+ break;
+ }
+ return 0;
+}
+
+
+
+//////////////////////
+// rexプリフィックス
+//////////////////////
+void set_rex(int op_size,int reg,int index_reg,int base_reg){
+ char RexByte;
+
+ if(reg==REG_NON&&index_reg==REG_NON){
+ /////////////////////////////////////
+ // レジスタをr/mのみに指定するとき
+ /////////////////////////////////////
+
+ if((base_reg&0x08)==0){
+ if(op_size==sizeof(char)&&(base_reg&0x04)){
+ // r/m に spl,bpl,sil,dilを指定するとき
+ RexByte=0x40;
+ }
+ else RexByte=0;
+ }
+ else RexByte=(char)0x41;
+ }
+ else{
+ /////////////////
+ // 通常
+ /////////////////
+
+ if((reg&0x08)==0){
+ //reg … rax~rdi
+
+ if((index_reg&0x08)==0){
+ if((base_reg&0x08)==0) RexByte=0;
+ else RexByte=(char)0x41;
+ }
+ else{
+ if((base_reg&0x08)==0) RexByte=(char)0x42;
+ else RexByte=(char)0x43;
+ }
+ }
+ else{
+ //reg … r8~r15
+
+ if((index_reg&0x08)==0){
+ if((base_reg&0x08)==0) RexByte=(char)0x44;
+ else RexByte=(char)0x45;
+ }
+ else{
+ if((base_reg&0x08)==0) RexByte=(char)0x46;
+ else RexByte=(char)0x47;
+ }
+ }
+ }
+
+ if(op_size==sizeof(_int64)){
+ //64ビットオペランド
+ RexByte|=0x48;
+ }
+
+ if(RexByte) OpBuffer[obp++]=RexByte;
+}
+
+
+
+/////////////////////////////////////////////////
+// ModR/Mバイト、SIBバイト、ディスプレースメント
+/////////////////////////////////////////////////
+
+//スケール
+#define SCALE_NON (char)0x00
+#define SCALE_2 (char)0x40
+#define SCALE_4 (char)0x80
+#define SCALE_8 (char)0xC0
+
+//インデックスなし
+#define INDEX_NON 0x04
+
+void set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,int disp){
+ if(mod==MOD_DISP32){
+ //ModR/Mバイト
+ OpBuffer[obp++]=(char)( REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(0x04));
+
+ base_reg=0x05;
+ index_reg=INDEX_NON;
+ }
+ else{
+ //ModR/Mバイト
+ OpBuffer[obp++]=(char)(mod | REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(base_reg));
+ }
+
+
+ //レジスタモードの場合は、ここで終了
+ if(mod==MOD_REG) return;
+
+
+ if(REGISTER_OPERAND(base_reg)==0x04||mod==MOD_DISP32){
+ //////////////////////
+ // SIBバイトを使う
+ //////////////////////
+
+ OpBuffer[obp++]=(char)(scale| REGISTER_OPERAND(index_reg)<<3 | REGISTER_OPERAND(base_reg));
+ }
+
+ //ディスプレースメントを必要としない場合は、ここで終了
+ if(mod==MOD_BASE) return;
+
+
+ //////////////////////////
+ // ディスプレースメント
+ //////////////////////////
+
+ if(mod==MOD_BASE_DISP8) OpBuffer[obp++]=(char)disp;
+ else{
+ *((long *)(OpBuffer+obp))=disp;
+ obp+=sizeof(long);
+ }
+}
+
+
+
+void __op_format(int op_size,char op_prefix,char opcode1,char opcode2,int reg,int base_reg,int offset,char mod){
+ //命令プリフィックス
+ if(op_prefix) OpBuffer[obp++]=op_prefix;
+
+ //rexプリフィックス
+ set_rex(op_size,reg,0,base_reg);
+
+ //オペコード
+ OpBuffer[obp++]=opcode1;
+ if(opcode2) OpBuffer[obp++]=opcode2;
+
+ //ModR/M, SIB, disp
+ set_mod_rm_sib_disp(mod,reg,SCALE_NON,INDEX_NON,base_reg,offset);
+}
+
+
+
+
+//////////////////////////
+// スタック関連
+//////////////////////////
+
+void op_push(int reg){
+ //スタックにレジスタの値をプッシュ
+
+ if(REG_RAX<=reg&®<=REG_RDI){
+ /* rax~rdi
+ 0101 0xxx */
+ OpBuffer[obp++]=(char)(0x50| REGISTER_OPERAND(reg) );
+ }
+ if(REG_R8<=reg&®<=REG_R15){
+ /* r8~r15
+ 0100 0001 0101 0xxx */
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)(0x50| REGISTER_OPERAND(reg) );
+ }
+}
+void op_push_value(long data){
+ //スタックにリテラル値をプッシュ
+ if(-128<=data&&data<=127){
+ //push 8ビット値
+ OpBuffer[obp++]=(char)0x6A;
+ OpBuffer[obp++]=(char)data;
+ }
+ else{
+ //push 32ビット値
+ OpBuffer[obp++]=(char)0x68;
+ *((long *)(OpBuffer+obp))=data;
+ obp+=sizeof(long);
+ }
+}
+void op_pop(int reg){
+ //スタックの内容をレジスタにポップ
+ if(REG_RAX<=reg&®<=REG_RDI){
+ /* rax~rdi
+ 0101 1xxx */
+ OpBuffer[obp++]=(char)(0x58| REGISTER_OPERAND(reg) );
+ }
+ if(REG_R8<=reg&®<=REG_R15){
+ /* r8~r15
+ 0100 0001 0101 1xxx */
+ OpBuffer[obp++]=(char)0x41;
+ OpBuffer[obp++]=(char)(0x58| REGISTER_OPERAND(reg) );
+ }
+}
+
+
+
+///////////////////
+// mov関連
+///////////////////
+
+void op_mov_RV(int op_size,int reg,int i32data){
+ //mov reg,i32data
+
+ //rexプリフィックス
+ set_rex(op_size,REG_NON,REG_NON,reg);
+
+ if(op_size==sizeof(_int64)){
+ //オペコード
+ OpBuffer[obp++]=(char)0xC7;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg) );
+ }
+ else{
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xB8| REGISTER_OPERAND(reg) );
+ }
+
+ //即値
+ *((long *)(OpBuffer+obp))=i32data;
+ obp+=sizeof(long);
+}
+void op_mov_RV64(int reg,_int64 i64data){
+ //mov reg,i64data
+
+ //rexプリフィックス
+ set_rex(sizeof(_int64),REG_NON,REG_NON,reg);
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xB8| REGISTER_OPERAND(reg) );
+
+ //即値
+ *((_int64 *)(OpBuffer+obp))=i64data;
+ obp+=sizeof(_int64);
+}
+void op_mov_RM(int op_size,int reg,int base_reg,int offset,char mod){
+ //mov reg64,qword ptr[base_reg+offset]
+ //mov reg32,dword ptr[base_reg+offset]
+ //mov reg16,word ptr[base_reg+offset]
+ //mov reg8,byte ptr[base_reg+offset]
+
+ //16ビット演算の命令プリフィックス
+ char op_prefix=0;
+ if(op_size==sizeof(short)) op_prefix=(char)0x66;
+
+ //オペコード
+ char opcode;
+ if(op_size==sizeof(char)) opcode=(char)0x8A;
+ else opcode=(char)0x8B;
+
+ __op_format(op_size,op_prefix,opcode,0,reg,base_reg,offset,mod);
+}
+void op_mov_RM_ex(int op_size,int reg,int base_reg1,int base_reg2,int offset,BOOL bUseOffset){
+ //mov reg64,qword ptr[base_reg1+base_reg2+offset]
+ //mov reg32,dword ptr[base_reg1+base_reg2+offset]
+ //mov reg16,word ptr[base_reg1+base_reg2+offset]
+ //mov reg8,byte ptr[base_reg1+base_reg2+offset]
+
+ if(base_reg1==REG_RSP){
+ //SIBバイトのindex部にrspは指定できない
+ base_reg1=base_reg2;
+ base_reg2=REG_RSP;
+ }
+
+ //16ビット演算のプリフィックス
+ if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66;
+
+ //rexプリフィックス
+ set_rex(op_size,reg,base_reg1,base_reg2);
+
+ //オペコード
+ if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0x8A;
+ else OpBuffer[obp++]=(char)0x8B;
+
+ if(bUseOffset){
+ ///////////////////////////
+ // オフセット値を使う
+ ///////////////////////////
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0x84| REGISTER_OPERAND(reg)<<3);
+
+ //ベースレジスタ
+ OpBuffer[obp++]=(char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2));
+
+ //オフセット値
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+ else{
+ ///////////////////////////
+ // オフセット値を使わない
+ ///////////////////////////
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0x04| REGISTER_OPERAND(reg)<<3);
+
+ //ベースレジスタ
+ OpBuffer[obp++]=(char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2));
+ }
+}
+void op_mov_MR(int op_size,int reg,int base_reg,int offset,char mod){
+ //mov qword ptr[base_reg+offset],reg64
+ //mov dword ptr[base_reg+offset],reg32
+ //mov word ptr[base_reg+offset],reg16
+ //mov byte ptr[base_reg+offset],reg8
+
+ //16ビット演算の命令プリフィックス
+ char op_prefix=0;
+ if(op_size==sizeof(short)) op_prefix=(char)0x66;
+
+ //オペコード
+ char opcode;
+ if(op_size==sizeof(char)) opcode=(char)0x88;
+ else opcode=(char)0x89;
+
+ __op_format(op_size,op_prefix,opcode,0,reg,base_reg,offset,mod);
+}
+void op_mov_MR_ex(int op_size,int reg,int base_reg1,int base_reg2,int offset,BOOL bUseOffset){
+ //mov qword ptr[base_reg1+base_reg2+offset],reg64
+ //mov dword ptr[base_reg1+base_reg2+offset],reg32
+ //mov word ptr[base_reg1+base_reg2+offset],reg16
+ //mov byte ptr[base_reg1+base_reg2+offset],reg8
+
+ if(base_reg1==REG_RSP){
+ //SIBバイトのindex部にrspは指定できない
+ base_reg1=base_reg2;
+ base_reg2=REG_RSP;
+ }
+
+ //16ビット演算のプリフィックス
+ if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66;
+
+ //rexプリフィックス
+ set_rex(op_size,reg,base_reg1,base_reg2);
+
+ //オペコード
+ if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0x88;
+ else OpBuffer[obp++]=(char)0x89;
+
+ if(bUseOffset==USE_OFFSET){
+ //////////////////////////
+ //オフセット値を使う
+ //////////////////////////
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0x84| REGISTER_OPERAND(reg)<<3);
+
+ //ベースレジスタ
+ OpBuffer[obp++]=(char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2));
+
+ //オフセット値
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+ else{
+ //////////////////////////
+ //オフセット値を使わない
+ //////////////////////////
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0x04| REGISTER_OPERAND(reg)<<3);
+
+ //ベースレジスタ
+ OpBuffer[obp++]=(char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2));
+ }
+}
+
+void op_mov_MV(int op_size,int base_reg,int offset,BOOL bUseOffset,int i32data){
+ //mov ptr[base_reg+offset],i32data
+ //mov ptr[base_reg ],i32data
+
+ //16ビット演算のプリフィックス
+ if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66;
+
+ //rexプリフィックス
+ set_rex(op_size,0,0,base_reg);
+
+ //オペコード
+ if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0xC6;
+ else OpBuffer[obp++]=(char)0xC7;
+
+ if(bUseOffset==USE_OFFSET){
+ //////////////////////////
+ //オフセット値を使う
+ //////////////////////////
+
+ //ModR/M, SIB, disp
+ set_mod_rm_sib_disp(MOD_BASE_DISP32,0,SCALE_NON,INDEX_NON,base_reg,offset);
+ }
+ else{
+ //ModR/M, SIB, disp
+ set_mod_rm_sib_disp(MOD_BASE,0,SCALE_NON,INDEX_NON,base_reg,0);
+ }
+
+ //即値
+ if(op_size==sizeof(_int64)||op_size==sizeof(long)){
+ //32/64ビット
+ *((long *)(OpBuffer+obp))=i32data;
+ obp+=sizeof(long);
+ }
+ else if(op_size==sizeof(short)){
+ //16ビット
+ *((short *)(OpBuffer+obp))=(short)i32data;
+ obp+=sizeof(short);
+ }
+ else if(op_size==sizeof(char)){
+ //16ビット
+ *((char *)(OpBuffer+obp))=(char)i32data;
+ obp++;
+ }
+}
+
+void op_mov_RR(int reg1,int reg2){
+ op_mov64_ToReg_FromReg(reg1,reg2);
+}
+
+
+
+///////////////////
+// mov64関連
+///////////////////
+
+void op_mov64_ToReg(int reg,_int64 i64data){
+ //mov reg,i64data
+
+ if(REG_RAX<=reg&®<=REG_RDI){
+ /* rax~rdi
+ 0100 1000 1011 1xxx [64bit data] */
+ OpBuffer[obp++]=(char)0x48;
+ OpBuffer[obp++]=(char)(0xB8| REGISTER_OPERAND(reg) );
+ *((_int64 *)(OpBuffer+obp))=i64data;
+ obp+=sizeof(_int64);
+ }
+ if(REG_R8<=reg&®<=REG_R15){
+ /* r8~r15
+ 0100 1001 1011 1xxx [64bit data] */
+ OpBuffer[obp++]=(char)0x49;
+ OpBuffer[obp++]=(char)(0xB8| REGISTER_OPERAND(reg) );
+ *((_int64 *)(OpBuffer+obp))=i64data;
+ obp+=sizeof(_int64);
+ }
+}
+void op_mov64_ToReg(int reg,int i32data){
+ //mov reg,i32data
+
+ if(REG_RAX<=reg&®<=REG_RDI){
+ /* rax~rdi
+ 0100 1000 1100 0111 1100 0xxx [32bit data] */
+ OpBuffer[obp++]=(char)0x48;
+ OpBuffer[obp++]=(char)0xC7;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg) );
+ *((long *)(OpBuffer+obp))=i32data;
+ obp+=sizeof(long);
+ }
+ if(REG_R8<=reg&®<=REG_R15){
+ /* r8~r15
+ 0100 1001 1100 0111 1100 0xxx [32bit data] */
+ OpBuffer[obp++]=(char)0x49;
+ OpBuffer[obp++]=(char)0xC7;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg) );
+ *((long *)(OpBuffer+obp))=i32data;
+ obp+=sizeof(long);
+ }
+}
+void op_mov64_ToReg_FromReg(int reg1,int reg2){
+ //mov reg1,reg2
+ char RexByte=-1;
+
+ if(reg1==reg2) return;
+
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ // [8bit rex] 1000 1011 11xx xbbb
+ OpBuffer[obp++]=RexByte;
+ OpBuffer[obp++]=(char)0x8B;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+void op_movsxd(int reg64,int reg32){
+ //movsxd reg64,reg32
+ char RexByte=-1;
+
+ if(REG_RAX<=reg64&®64<=REG_RDI){
+ if(REG_RAX<=reg32&®32<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg32&®32<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_R8<=reg64&®64<=REG_R15){
+ if(REG_RAX<=reg32&®32<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg32&®32<=REG_R15) RexByte=(char)0x4D;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //[8bit rex] 0110 0011 11rr rbbb
+ OpBuffer[obp++]=RexByte;
+ OpBuffer[obp++]=(char)0x63;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg64)<<3 | REGISTER_OPERAND(reg32));
+}
+void op_movsx64_FromReg16(int reg64,int reg16){
+ //movsx reg64,reg16
+ char RexByte=-1;
+
+ if(REG_RAX<=reg64&®64<=REG_RDI){
+ if(REG_RAX<=reg16&®16<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg16&®16<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_R8<=reg64&®64<=REG_R15){
+ if(REG_RAX<=reg16&®16<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg16&®16<=REG_R15) RexByte=(char)0x4D;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //[8bit rex] 0000 1111 1011 1111 11rr rbbb
+ OpBuffer[obp++]=RexByte;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg64)<<3 | REGISTER_OPERAND(reg16));
+}
+void op_movsx64_FromReg8(int reg64,int reg8){
+ //movsx reg64,reg8
+ char RexByte=-1;
+
+ if(REG_RAX<=reg64&®64<=REG_RDI){
+ if(REG_RAX<=reg8&®8<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg8&®8<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_R8<=reg64&®64<=REG_R15){
+ if(REG_RAX<=reg8&®8<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg8&®8<=REG_R15) RexByte=(char)0x4D;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //[8bit rex] 0000 1111 1011 1110 11rr rbbb
+ OpBuffer[obp++]=RexByte;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg64)<<3 | REGISTER_OPERAND(reg8));
+}
+
+
+
+//////////////////
+// mov32関連
+//////////////////
+
+void op_movsx32_FromReg16(int reg32,int reg16){
+ //movsx reg32,reg16
+ char RexByte=-1;
+
+ if(REG_RAX<=reg32&®32<=REG_RDI){
+ if(REG_RAX<=reg16&®16<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg16&®16<=REG_R15) RexByte=(char)0x41;
+ }
+ if(REG_R8<=reg32&®32<=REG_R15){
+ if(REG_RAX<=reg16&®16<=REG_RDI) RexByte=(char)0x44;
+ if(REG_R8<=reg16&®16<=REG_R15) RexByte=(char)0x45;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //[8bit rex] 0000 1111 1011 1111 11rr rbbb
+ if(RexByte) OpBuffer[obp++]=RexByte;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBF;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg32)<<3 | REGISTER_OPERAND(reg16));
+}
+void op_movsx32_FromReg8(int reg32,int reg8){
+ //movsx reg32,reg8
+ char RexByte=-1;
+
+ if(REG_RAX<=reg32&®32<=REG_RDI){
+ if(REG_RAX<=reg8&®8<=REG_RBX) RexByte=0;
+ if(REG_RSP<=reg8&®8<=REG_RDI) RexByte=(char)0x40;
+ if(REG_R8<=reg8&®8<=REG_R15) RexByte=(char)0x41;
+ }
+ if(REG_R8<=reg32&®32<=REG_R15){
+ if(REG_RAX<=reg8&®8<=REG_RDI) RexByte=(char)0x44;
+ if(REG_R8<=reg8&®8<=REG_R15) RexByte=(char)0x45;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //[8bit rex] 0000 1111 1011 1110 11rr rbbb
+ if(RexByte) OpBuffer[obp++]=RexByte;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg32)<<3 | REGISTER_OPERAND(reg8));
+}
+
+
+
+/////////////////////
+// mov16関連
+/////////////////////
+
+void op_movsx16_FromReg8(int reg32,int reg8){
+ //movsx reg16,reg8
+ char RexByte=-1;
+
+ if(REG_RAX<=reg32&®32<=REG_RDI){
+ if(REG_RAX<=reg8&®8<=REG_RBX) RexByte=0;
+ if(REG_RSP<=reg8&®8<=REG_RDI) RexByte=(char)0x40;
+ if(REG_R8<=reg8&®8<=REG_R15) RexByte=(char)0x41;
+ }
+ if(REG_R8<=reg32&®32<=REG_R15){
+ if(REG_RAX<=reg8&®8<=REG_RDI) RexByte=(char)0x44;
+ if(REG_R8<=reg8&®8<=REG_R15) RexByte=(char)0x45;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //0110 0110 [8bit rex] 0000 1111 1011 1110 11rr rbbb
+ OpBuffer[obp++]=(char)0x66;
+ if(RexByte) OpBuffer[obp++]=RexByte;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xBE;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg32)<<3 | REGISTER_OPERAND(reg8));
+}
+
+
+
+//////////////////////////////////
+// インクリメント・デクリメント
+//////////////////////////////////
+
+void op_inc(int reg){
+ //inc reg
+
+ //16ビット演算の命令プリフィックス
+ char op_prefix=0;
+
+ //オペコード
+ char opcode=(char)0xFF;
+
+ __op_format(sizeof(_int64),op_prefix,opcode,0,0,reg,0,MOD_REG);
+}
+void op_dec(int reg){
+ op_inc(reg);
+ OpBuffer[obp-1]=OpBuffer[obp-1]|0x08;
+}
+
+
+
+/////////////////////
+// add関連
+/////////////////////
+
+void op_add_RM(int op_size,int reg,int base_reg,int offset,char mod){
+ //add reg64,qword ptr[base_reg+offset]
+ //add reg32,dword ptr[base_reg+offset]
+ //add reg16,word ptr[base_reg+offset]
+ //add reg8,byte ptr[base_reg+offset]
+
+ //16ビット演算の命令プリフィックス
+ char op_prefix=0;
+ if(op_size==sizeof(short)) op_prefix=(char)0x66;
+
+ //オペコード
+ char opcode;
+ if(op_size==sizeof(char)) opcode=(char)0x02;
+ else opcode=(char)0x03;
+
+ __op_format(op_size,op_prefix,opcode,0,reg,base_reg,offset,mod);
+}
+
+void op_add64_value(int reg,int offset){
+ //add reg,offset
+ char RexByte=-1;
+
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=0x48;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=0x49;
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ if(reg==REG_RAX){
+ //raxのみ特殊
+
+ // [8bit rex] 0000 0101 [32bit offset]
+ OpBuffer[obp++]=(char)RexByte;
+ OpBuffer[obp++]=(char)0x05;
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+ else{
+ //rax以外
+
+ //[8bit rex] 1000 0001 1100 0xxx [32bit offset]
+ OpBuffer[obp++]=(char)RexByte;
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg));
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+}
+void op_add64_reg(int reg1,int reg2){
+ //add reg1,reg2
+ char RexByte=-1;
+
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //[8bit rex] 0000 0011 11rr rbbb
+ OpBuffer[obp++]=(char)RexByte;
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+void op_add32_reg(int reg1,int reg2){
+ //add reg1,reg2
+ char RexByte=-1;
+
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x41;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x44;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x45;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //[8bit rex] 0000 0011 11rr rbbb
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+ OpBuffer[obp++]=(char)0x03;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+
+
+
+////////////////////////
+// sub関連
+////////////////////////
+
+void op_sub_RV(int op_size,int reg,int i32data){
+ //sub reg,i32data
+
+ //rexプリフィックス
+ set_rex(op_size,REG_NON,REG_NON,reg);
+
+ if(reg==REG_RAX){
+ //raxのみ特殊
+ OpBuffer[obp++]=(char)0x2D;
+ }
+ else{
+ //オペコード
+ OpBuffer[obp++]=(char)0x81;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xE8| REGISTER_OPERAND(reg) );
+ }
+
+ //即値
+ *((long *)(OpBuffer+obp))=i32data;
+ obp+=sizeof(long);
+}
+void op_sub64_reg(int reg1,int reg2){
+ //sub reg1,reg2
+ char RexByte=-1;
+
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //[8bit rex] 0010 1011 11rr rbbb
+ OpBuffer[obp++]=(char)RexByte;
+ OpBuffer[obp++]=(char)0x2B;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+void op_sub32_reg(int reg1,int reg2){
+ //sub reg1,reg2
+ char RexByte=-1;
+
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x41;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x44;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x45;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //[8bit rex] 0010 1011 11rr rbbb
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+ OpBuffer[obp++]=(char)0x2B;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+
+
+
+////////////////////////
+// imul関連
+////////////////////////
+
+void op_imul_reg(int op_size,int reg1,int reg2){
+ //imul reg1,reg2
+ char RexByte=-1;
+
+ if(op_size==sizeof(_int64)){
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D;
+ }
+ }
+ else{
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x41;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x44;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x45;
+ }
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+
+ //rexプリフィックス
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0xAF;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+void op_imul_value(int op_size,int reg,int i32data){
+ //imul reg,i32data
+ char RexByte=-1;
+
+ if(op_size==sizeof(_int64)){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x4D;
+ }
+ else{
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x45;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+
+ //rexプリフィックス
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+
+ if(-128<=i32data&&i32data<=127){
+ //オペコード
+ OpBuffer[obp++]=(char)0x6B;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg));
+
+ //値
+ OpBuffer[obp++]=(char)i32data;
+ }
+ else{
+ //オペコード
+ OpBuffer[obp++]=(char)0x69;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg));
+
+ //値
+ *((long *)(OpBuffer+obp))=i32data;
+ obp+=sizeof(long);
+ }
+}
+
+
+
+////////////////////////
+// div、idiv関連
+////////////////////////
+
+void op_div64_reg(int reg){
+ //div reg
+ char RexByte=-1;
+
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x49;
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //rexプリフィックス
+ OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ OpBuffer[obp++]=(char)0xF7;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xF0| REGISTER_OPERAND(reg));
+}
+void op_idiv64_reg(int reg){
+ //idiv reg
+ char RexByte=-1;
+
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x49;
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //rexプリフィックス
+ OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ OpBuffer[obp++]=(char)0xF7;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xF8| REGISTER_OPERAND(reg));
+}
+
+
+
+////////////////////
+// ビットシフト関連
+////////////////////
+
+void op_shl_reg(int op_size,int reg){
+ //shl reg,cl
+ char RexByte=-1;
+
+ if(op_size==sizeof(_int64)){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x49;
+ }
+ else if(op_size==sizeof(char)){
+ if(REG_RAX<=reg&®<=REG_RBX) RexByte=0;
+ if(REG_RSP<=reg&®<=REG_RDI) RexByte=(char)0x40;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x41;
+ }
+ else{
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x41;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+
+ //16ビット演算のプリフィックス
+ if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66;
+
+ //rexプリフィックス
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0xD2;
+ else OpBuffer[obp++]=(char)0xD3;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xE0| REGISTER_OPERAND(reg));
+}
+void op_sar_reg(int op_size,int reg){
+ //sar reg,cl
+ char RexByte=-1;
+
+ if(op_size==sizeof(_int64)){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x49;
+ }
+ else if(op_size==sizeof(char)){
+ if(REG_RAX<=reg&®<=REG_RBX) RexByte=0;
+ if(REG_RSP<=reg&®<=REG_RDI) RexByte=(char)0x40;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x41;
+ }
+ else{
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x41;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+
+ //16ビット演算のプリフィックス
+ if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66;
+
+ //rexプリフィックス
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0xD2;
+ else OpBuffer[obp++]=(char)0xD3;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xF8| REGISTER_OPERAND(reg));
+}
+void op_shr_reg(int op_size,int reg){
+ //shr reg,cl
+ char RexByte=-1;
+
+ if(op_size==sizeof(_int64)){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x49;
+ }
+ else if(op_size==sizeof(char)){
+ if(REG_RAX<=reg&®<=REG_RBX) RexByte=0;
+ if(REG_RSP<=reg&®<=REG_RDI) RexByte=(char)0x40;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x41;
+ }
+ else{
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x41;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+
+ //16ビット演算のプリフィックス
+ if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66;
+
+ //rexプリフィックス
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0xD2;
+ else OpBuffer[obp++]=(char)0xD3;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xE8| REGISTER_OPERAND(reg));
+}
+
+
+
+////////////////////
+// and 関連
+////////////////////
+
+void op_and_reg(int op_size,int reg1,int reg2){
+ //and reg1,reg2
+ char RexByte=-1;
+
+ if(op_size==sizeof(_int64)){
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D;
+ }
+ }
+ else{
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x41;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x44;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x45;
+ }
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+
+ //rexプリフィックス
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x23;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+void op_and64_value(int reg,int offset){
+ //and reg,offset
+ char RexByte=-1;
+
+ if(REG_RAX<=reg&®<=REG_RDI) (char)RexByte=0x48;
+ if(REG_R8<=reg&®<=REG_R15) (char)RexByte=0x49;
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ if(reg==REG_RAX){
+ //raxのみ特殊
+
+ // [8bit rex] 0010 0101 [32bit offset]
+ OpBuffer[obp++]=(char)RexByte;
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+ else{
+ //rax以外
+
+ //[8bit rex] 1000 0001 1100 0xxx [32bit offset]
+ OpBuffer[obp++]=(char)RexByte;
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)(0xE0| REGISTER_OPERAND(reg));
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+}
+void op_and32_value(int reg,int offset){
+ //and reg,offset
+ char RexByte=-1;
+
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x41;
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ if(reg==REG_RAX){
+ //eaxのみ特殊
+
+ // [8bit rex] 0010 0101 [32bit offset]
+ OpBuffer[obp++]=(char)0x25;
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+ else{
+ //eax以外
+
+ //[8bit rex] 1000 0001 1100 0xxx [32bit offset]
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)(0xE0| REGISTER_OPERAND(reg));
+ *((long *)(OpBuffer+obp))=offset;
+ obp+=sizeof(long);
+ }
+}
+
+
+
+////////////////////////
+// or 関連
+////////////////////////
+
+void op_or_reg(int op_size,int reg1,int reg2){
+ //or reg1,reg2
+ char RexByte=-1;
+
+ if(op_size==sizeof(_int64)){
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D;
+ }
+ }
+ else{
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x41;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x44;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x45;
+ }
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+
+ //rexプリフィックス
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x0B;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+
+
+
+////////////////////////
+// xor 関連
+////////////////////////
+
+void op_xor_reg(int op_size,int reg1,int reg2){
+ //xor reg1,reg2
+ char RexByte=-1;
+
+ if(op_size==sizeof(_int64)){
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D;
+ }
+ }
+ else{
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x41;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x44;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x45;
+ }
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+
+ //rexプリフィックス
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x33;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+
+
+
+///////////////////////
+// not 関連
+///////////////////////
+
+void op_not_reg(int op_size,int reg){
+ //not reg
+ char RexByte=-1;
+
+ if(op_size==sizeof(_int64)){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x49;
+ }
+ else{
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x41;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+
+ //rexプリフィックス
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ OpBuffer[obp++]=(char)0xF7;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xD0| REGISTER_OPERAND(reg));
+}
+
+
+
+////////////////////
+// test関連
+////////////////////
+
+void op_test(int reg1,int reg2){
+ //test reg1,reg2
+ char RexByte=-1;
+
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D;
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+ //[8bit rex] 1000 0101 11rr rbbb
+ OpBuffer[obp++]=(char)RexByte;
+ OpBuffer[obp++]=(char)0x85;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+
+
+
+/////////////////////
+// cmp 関連
+/////////////////////
+
+void op_cmp_reg(int op_size,int reg1,int reg2){
+ //cmp reg1,reg2
+ char RexByte=-1;
+
+ if(op_size==sizeof(_int64)){
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x4D;
+ }
+ }
+ else{
+ if(REG_RAX<=reg1&®1<=REG_RDI){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x41;
+ }
+ if(REG_R8<=reg1&®1<=REG_R15){
+ if(REG_RAX<=reg2&®2<=REG_RDI) RexByte=(char)0x44;
+ if(REG_R8<=reg2&®2<=REG_R15) RexByte=(char)0x45;
+ }
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+
+ //rexプリフィックス
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x3B;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
+}
+void op_cmp_value(int op_size,int reg,char byte_data){
+ //cmp reg,byte_data
+
+ if(op_size==sizeof(char)&®==REG_RAX){
+ //alレジスタの場合は特殊
+ OpBuffer[obp++]=(char)0x3C;
+
+ //8ビット値
+ OpBuffer[obp++]=byte_data;
+
+ return;
+ }
+
+ //16ビット演算のプリフィックス
+ if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66;
+
+ //rexプリフィックス
+ set_rex(op_size,REG_NON,REG_NON,reg);
+
+ //オペコード
+ if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0x80;
+ else OpBuffer[obp++]=(char)0x83;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xF8| REGISTER_OPERAND(reg));
+
+ //8ビット値
+ OpBuffer[obp++]=byte_data;
+}
+
+
+////////////////////
+// SSE2関連
+////////////////////
+
+void op_movlpd_MR(int xmm_reg,int base_reg,int offset,char mod){
+ //movlpd qword ptr[base_reg+offset],xmm_reg
+ __op_format(0,(char)0x66,(char)0x0F,(char)0x13,xmm_reg,base_reg,offset,mod);
+}
+void op_movlpd_RM(int xmm_reg,int base_reg,int offset,char mod){
+ //movlpd xmm_reg,qword ptr[base_reg+offset]
+ __op_format(0,(char)0x66,(char)0x0F,(char)0x12,xmm_reg,base_reg,offset,mod);
+}
+void op_movsd_RR(int xmm_reg1,int xmm_reg2){
+ if(xmm_reg1==xmm_reg2) return;
+
+ //movsd xmm_reg1,xmm_reg2
+ __op_format(0,(char)0xF2,(char)0x0F,(char)0x10,xmm_reg1,xmm_reg2,0,MOD_REG);
+}
+void op_movsd_MR(int xmm_reg,int base_reg,int offset,char mod){
+ //movsd qword ptr[reg+offset],xmm_reg
+ //movsd qword ptr[reg],xmm_reg
+ __op_format(0,(char)0xF2,(char)0x0F,(char)0x11,xmm_reg,base_reg,offset,mod);
+}
+void op_movss_RR(int xmm_reg1,int xmm_reg2){
+ if(xmm_reg1==xmm_reg2) return;
+
+ //movss xmm_reg1,xmm_reg2
+ __op_format(0,(char)0xF3,(char)0x0F,(char)0x10,xmm_reg1,xmm_reg2,0,MOD_REG);
+}
+void op_movss_RM(int xmm_reg,int base_reg,int offset,char mod){
+ //movss xmm_reg,dword ptr[base_reg+offset]
+ __op_format(0,(char)0xF3,(char)0x0F,(char)0x10,xmm_reg,base_reg,offset,mod);
+}
+void op_movss_MR(int xmm_reg,int base_reg,int offset,char mod){
+ //movss dword ptr[reg+offset],xmm_reg
+ //movss dword ptr[reg],xmm_reg
+ __op_format(0,(char)0xF3,(char)0x0F,(char)0x11,xmm_reg,base_reg,offset,mod);
+}
+
+void op_movd_RX(int reg,int xmm_reg){
+ __op_format(sizeof(_int64),(char)0x66,(char)0x0F,(char)0x7E,xmm_reg,reg,0,MOD_REG);
+}
+
+void op_cvtsd2ss(int xmm_reg1,int xmm_reg2){
+ //cvtsd2ss xmm_reg1,xmm_reg2
+
+ //オペコード
+ OpBuffer[obp++]=(char)0xF2;
+
+ //rexプリフィックス
+ set_rex(sizeof(long),xmm_reg1,0,xmm_reg2);
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x5A;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2));
+}
+void op_cvtss2sd(int xmm_reg1,int xmm_reg2){
+ //cvtss2sd xmm_reg1,xmm_reg2
+
+ //オペコード
+ OpBuffer[obp++]=(char)0xF3;
+
+ //rexプリフィックス
+ set_rex(0,xmm_reg1,0,xmm_reg2);
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x5A;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2));
+}
+void op_cvttsd2si_xmm(int op_size,int reg,int xmm_reg){
+ //cvttsd2si reg,xmm_reg
+
+ //オペコード
+ OpBuffer[obp++]=(char)0xF2;
+
+ //rexプリフィックス
+ set_rex(op_size,reg,0,xmm_reg);
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x2C;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(xmm_reg));
+}
+void op_cvttss2si_xmm(int op_size,int reg,int xmm_reg){
+ //cvttss2si reg,xmm_reg
+
+ //オペコード
+ OpBuffer[obp++]=(char)0xF3;
+
+ //rexプリフィックス
+ set_rex(op_size,reg,0,xmm_reg);
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x2C;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(xmm_reg));
+}
+void op_cvtsi2sd_reg(int op_size,int xmm_reg,int reg){
+ //cvtsi2sd xmm_reg,reg
+ char RexByte=-1;
+
+ if(op_size==sizeof(_int64)){
+ if(REG_XMM0<=xmm_reg&&xmm_reg<=REG_XMM7){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_XMM8<=xmm_reg&&xmm_reg<=REG_XMM15){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x4D;
+ }
+ }
+ else{
+ if(REG_XMM0<=xmm_reg&&xmm_reg<=REG_XMM7){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x41;
+ }
+ if(REG_XMM8<=xmm_reg&&xmm_reg<=REG_XMM15){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x44;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x45;
+ }
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+
+ //オペコード
+ OpBuffer[obp++]=(char)0xF2;
+
+ //rexプリフィックス
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x2A;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(xmm_reg)<<3 | REGISTER_OPERAND(reg));
+}
+void op_cvtsi2ss_reg(int op_size,int xmm_reg,int reg){
+ //cvtsi2ss xmm_reg,reg
+ char RexByte=-1;
+
+ if(op_size==sizeof(_int64)){
+ if(REG_XMM0<=xmm_reg&&xmm_reg<=REG_XMM7){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x48;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x49;
+ }
+ if(REG_XMM8<=xmm_reg&&xmm_reg<=REG_XMM15){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x4C;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x4D;
+ }
+ }
+ else{
+ if(REG_XMM0<=xmm_reg&&xmm_reg<=REG_XMM7){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=0;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x41;
+ }
+ if(REG_XMM8<=xmm_reg&&xmm_reg<=REG_XMM15){
+ if(REG_RAX<=reg&®<=REG_RDI) RexByte=(char)0x44;
+ if(REG_R8<=reg&®<=REG_R15) RexByte=(char)0x45;
+ }
+ }
+
+ if(RexByte==-1) SetError(300,NULL,cp);
+
+
+ //オペコード
+ OpBuffer[obp++]=(char)0xF3;
+
+ //rexプリフィックス
+ if(RexByte) OpBuffer[obp++]=(char)RexByte;
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x2A;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(xmm_reg)<<3 | REGISTER_OPERAND(reg));
+}
+void op_comisd(int xmm_reg1,int xmm_reg2){
+ //comisd xmm_reg1,xmm_reg2
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x2F;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2));
+}
+void op_comiss(int xmm_reg1,int xmm_reg2){
+ //comiss xmm_reg1,xmm_reg2
+
+ //オペコード
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x2F;
+
+ //レジスタ
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2));
+}
+
+
+
+/////////////////////
+// ストリング関係
+/////////////////////
+
+void op_rep_movs(int op_size){
+ if(op_size==sizeof(BYTE)){
+ //rep movs byte ptr[edi],byte ptr[esi]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0xA4;
+ }
+ else if(op_size==sizeof(short)){
+ //rep movs word ptr[edi],word ptr[esi]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x66;
+ OpBuffer[obp++]=(char)0xA5;
+ }
+ else if(op_size==sizeof(long)){
+ //rep movs dword ptr[edi],dword ptr[esi]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0xA5;
+ }
+}
+
+
+
+
+void op_add_rsp(int num){
+ //スタックポインタの加算(pop方向)
+
+ //add rsp,num
+ if(0xFFFFFF80&num){
+ OpBuffer[obp++]=(char)0x48;
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC4;
+ *((long *)(OpBuffer+obp))=num;
+ obp+=sizeof(long);
+ }
+ else{
+ //「-128 < num < 127」の場合
+ OpBuffer[obp++]=(char)0x48;
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xC4;
+ OpBuffer[obp++]=(char)num;
+ }
+}
+void op_sub_rsp(int num){
+ //スタックポインタの減算(push方向)
+
+ //sub rsp,num
+ if(0xFFFFFF80&num){
+ OpBuffer[obp++]=(char)0x48;
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xEC;
+ *((long *)(OpBuffer+obp))=num;
+ obp+=sizeof(long);
+ }
+ else{
+ //「-128 < num < 127」の場合
+ OpBuffer[obp++]=(char)0x48;
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xEC;
+ OpBuffer[obp++]=(char)num;
+ }
+}
+
+
+void op_add_esp(int num){
+ //スタックポインタの加算(pop方向)
+
+ //add esp,num
+ if(0xFFFFFF80&num){
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xC4;
+ *((long *)(OpBuffer+obp))=num;
+ obp+=sizeof(long);
+ }
+ else{
+ //「-128 < num < 127」の場合
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xC4;
+ OpBuffer[obp++]=(char)num;
+ }
+}
+void op_sub_esp(int num){
+ //スタックポインタの減算(push方向)
+
+ //sub esp,num
+ if(0xFFFFFF80&num){
+ OpBuffer[obp++]=(char)0x81;
+ OpBuffer[obp++]=(char)0xEC;
+ *((long *)(OpBuffer+obp))=num;
+ obp+=sizeof(long);
+ }
+ else{
+ //「-128 < num < 127」の場合
+ OpBuffer[obp++]=(char)0x83;
+ OpBuffer[obp++]=(char)0xEC;
+ OpBuffer[obp++]=(char)num;
+ }
+}
+
+
+
+//////////////////////////////
+// 浮動小数点関連
+//////////////////////////////
+
+void op_fld_ptr_esp(int type){
+ //スタックポインタが示すバッファのデータを浮動小数点レジスタへロード
+
+ if(type==DEF_DOUBLE){
+ //fld qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDD;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(type==DEF_SINGLE){
+ //fld dword ptr[esp]
+ OpBuffer[obp++]=(char)0xD9;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(type==DEF_INT64){
+ //fild qword ptr[esp]
+ OpBuffer[obp++]=(char)0xDF;
+ OpBuffer[obp++]=(char)0x2C;
+ OpBuffer[obp++]=(char)0x24;
+ }
+ else if(type==DEF_LONG){
+ //fild dword ptr[esp]
+ OpBuffer[obp++]=(char)0xDB;
+ OpBuffer[obp++]=(char)0x04;
+ OpBuffer[obp++]=(char)0x24;
+ }
+}
+
+
+
+//////////////////////////////
+// レジスタ関連
+//////////////////////////////
+
+void op_zero_reg(int reg){
+ //レジスタに0をセット
+
+ if(REG_RAX<=reg&®<=REG_RDI){
+ /* rax~rdi
+ 0100 1000 0011 0011 11 xxx xxx */
+ OpBuffer[obp++]=(char)0x48;
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg));
+ }
+ if(REG_R8<=reg&®<=REG_R15){
+ /* r8~r15
+ 0100 1101 0011 0011 11 xxx xxx */
+ OpBuffer[obp++]=(char)0x4D;
+ OpBuffer[obp++]=(char)0x33;
+ OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg));
+ }
+}
+
+
+
+/////////////////////////////
+// 関数呼び出し
+/////////////////////////////
+
+void op_call(SUBINFO *psi){
+ OpBuffer[obp++]=(char)0xE8;
+ pobj_SubAddrSchedule->add(psi,1);
+ psi->bUse=1;
+ obp+=sizeof(long);
+}
Index: /BasicCompiler64/increment.cpp
===================================================================
--- /BasicCompiler64/increment.cpp (revision 3)
+++ /BasicCompiler64/increment.cpp (revision 3)
@@ -0,0 +1,164 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void IncDec(int idCalc, char *lpszLeft, char *lpszRight){
+ int VarType;
+ LONG_PTR lpVarIndex;
+ RELATIVE_VAR VarRelativeVar;
+
+
+ ///////////////////////////
+ // 変数アドレスを取得
+ ///////////////////////////
+
+ if(!GetVarOffset(
+ 1,
+ lpszLeft,
+ &VarType,
+ &VarRelativeVar,
+ &lpVarIndex)) return;
+
+ //変数オフセットを一時退避
+ if(IsUse_r11(&VarRelativeVar)){
+ //mov qword ptr[rsp+offset],r11 ※スタックフレームを利用
+ pobj_sf->push(REG_R11);
+ }
+
+
+ ///////////////////////////////////
+ // レジスタへ変数の内容をコピー
+ ///////////////////////////////////
+
+ int reg;
+ if(VarType==DEF_DOUBLE){
+ reg=REG_XMM0;
+ SetXmmReg_DoubleVariable(&VarRelativeVar,reg);
+ }
+ else if(VarType==DEF_SINGLE){
+ reg=REG_XMM0;
+ SetXmmReg_SingleVariable(&VarRelativeVar,reg);
+ }
+ else{
+ reg=REG_RAX;
+ SetReg_WholeVariable(VarType,&VarRelativeVar,reg);
+ }
+
+
+ if(IsWholeNumberType(VarType)&&lstrcmp(lpszRight,"1")==0&&
+ (idCalc==CALC_ADDITION||idCalc==CALC_SUBTRACTION)){
+ if(idCalc==CALC_ADDITION){
+ //インクリメント
+ op_inc(REG_RAX);
+ }
+ else if(idCalc==CALC_SUBTRACTION){
+ //デクリメント
+ op_dec(REG_RAX);
+ }
+ }
+ else{
+ //結果を格納しているレジスタをブロッキング
+ pobj_BlockReg->lock(reg);
+
+ //右辺を計算
+ int CalcType;
+ LONG_PTR lpCalcIndex;
+ if(reg==REG_RAX) reg=REG_RCX;
+ else reg=REG_RAX;
+ CalcType=NumOpe(®,lpszRight,VarType,lpVarIndex,&lpCalcIndex);
+
+ //レジスタのブロッキングを解除
+ pobj_BlockReg->clear();
+
+
+ if(IsPtrType(VarType)&&IsWholeNumberType(CalcType)&&(!IsPtrType(CalcType))){
+ //左辺がポインタ型、右辺が整数型の場合は、エラーをださないようにする
+ CalcType=VarType;
+ lpCalcIndex=lpVarIndex;
+ }
+
+
+ /////////////////////////////////
+ // 右辺、左辺の型チェックを行う
+ /////////////////////////////////
+
+ CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
+
+
+ //レジスタ管理オブジェクトを生成
+ pobj_reg=new CRegister(REG_RAX);
+
+ //左辺用レジスタ
+ if(IsRealNumberType(VarType))
+ pobj_reg->LockXmmReg();
+ else
+ pobj_reg->LockReg();
+
+ //右辺値レジスタ
+ if(VarType==DEF_DOUBLE)
+ ChangeTypeToXmm_Double(CalcType,
+ pobj_reg->LockXmmReg(),
+ pobj_reg->GetNextReg());
+ else if(VarType==DEF_SINGLE)
+ ChangeTypeToXmm_Single(CalcType,
+ pobj_reg->LockXmmReg(),
+ pobj_reg->GetNextReg());
+ else
+ ChangeTypeToWhole(CalcType,VarType,
+ pobj_reg->LockReg(),
+ pobj_reg->GetNextXmmReg());
+
+ int type[255],sp;
+ LONG_PTR index_stack[255];
+ type[0]=VarType;
+ type[1]=VarType;
+ index_stack[0]=lpVarIndex;
+ index_stack[1]=lpVarIndex;
+ sp=2;
+
+ switch(idCalc){
+ case CALC_XOR:
+ case CALC_OR:
+ case CALC_AND:
+ CalcTwoTerm_Logical(idCalc,type,index_stack,&sp);
+ break;
+ case CALC_SHL:
+ case CALC_SHR:
+ Calc_Shift(idCalc,type,&sp);
+ break;
+ case CALC_ADDITION:
+ case CALC_SUBTRACTION:
+ case CALC_PRODUCT:
+ CalcTwoTerm_Arithmetic(idCalc,type,index_stack,&sp);
+ break;
+ case CALC_MOD:
+ Calc_Mod(type,index_stack,&sp);
+ break;
+ case CALC_QUOTIENT:
+ Calc_Divide(type,&sp,VarType);
+ break;
+ case CALC_INTQUOTIENT:
+ Calc_IntDivide(type,index_stack,&sp);
+ break;
+ case CALC_POWER:
+ Calc_Power(type,&sp);
+ break;
+ }
+
+ //レジスタ管理オブジェクトを解放
+ delete pobj_reg;
+ pobj_reg=0;
+ }
+
+
+ /////////////////////////////////////////////////
+ // rax(実数はxmm0)の内容を変数にコピー
+ /////////////////////////////////////////////////
+
+ //変数オフセットを復元
+ if(IsUse_r11(&VarRelativeVar)){
+ //mov r11,qword ptr[rsp+offset] ※スタックフレームを利用
+ pobj_sf->pop(REG_R11);
+ }
+
+ SetVariableFromRax(VarType,VarType,&VarRelativeVar);
+}
Index: /BasicCompiler64/manifest.xml
===================================================================
--- /BasicCompiler64/manifest.xml (revision 3)
+++ /BasicCompiler64/manifest.xml (revision 3)
@@ -0,0 +1,22 @@
+
+
+
+Description
+
+
+
+
+
+
Index: /BasicCompiler64/resource.h
===================================================================
--- /BasicCompiler64/resource.h (revision 3)
+++ /BasicCompiler64/resource.h (revision 3)
@@ -0,0 +1,56 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by BasicCompiler.rc
+//
+#define IDD_MAIN 101
+#define IDD_VARLIST 103
+#define IDI_MAIN 108
+#define IDI_VARSTRUCT 109
+#define IDI_VARDATA 110
+#define IDI_VARSTR 111
+#define IDI_VARARRAY 112
+#define IDI_VARPTRSTRUCT 113
+#define IDD_CLIPMAIN 114
+#define IDD_DEBUGGER 115
+#define IDR_DEBUGGERTOOLBAR 117
+#define IDD_DEBUGGER_TOOLBARBASE 120
+#define IDR_DEBUGGER_VARLIST_MENU 122
+#define IDR_DEBUGGERTOOLBAR_DISABLED 125
+#define IDC_EXEPATH 1000
+#define IDC_PROGRESS 1001
+#define IDC_ERRORLIST 1002
+#define IDC_MESSAGE 1003
+#define IDC_DEBUGLIST 1005
+#define IDC_SHOWERROR 1006
+#define IDC_SHOWDEBUG 1007
+#define IDC_THREADCOMBO 1014
+#define IDC_VARTREE 1015
+#define IDC_GLOBAL 1016
+#define IDC_LOCAL 1017
+#define IDC_PROCCOMBO 1018
+#define IDC_HIDESYSVAR 1019
+#define IDC_STEPIN 1021
+#define IDC_STEPOVER 1022
+#define IDC_ESP 1023
+#define IDC_DUMMYCANCEL 1024
+#define IDC_TAB1 1025
+#define IDC_VARPOS 1029
+#define IDC_WATCHLIST 1033
+#define IDC_STATIC_VERSION 1034
+#define IDC_DEBUG_START 40003
+#define IDC_DEBUG_STEPOVER 40004
+#define IDC_DEBUG_STEPIN 40005
+#define IDM_SHOW_DEFAULTSYSTEM_VAR 40007
+#define IDM_SHOW_RAD_VAR 40008
+#define IDM_SHOW_GUID_VAR 40009
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 126
+#define _APS_NEXT_COMMAND_VALUE 40010
+#define _APS_NEXT_CONTROL_VALUE 1035
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
Index: /BasicCompiler64/resource_back.h
===================================================================
--- /BasicCompiler64/resource_back.h (revision 3)
+++ /BasicCompiler64/resource_back.h (revision 3)
@@ -0,0 +1,55 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by BasicCompiler.rc
+//
+#define IDD_MAIN 101
+#define IDD_VARLIST 103
+#define IDI_MAIN 108
+#define IDI_VARSTRUCT 109
+#define IDI_VARDATA 110
+#define IDI_VARSTR 111
+#define IDI_VARARRAY 112
+#define IDI_VARPTRSTRUCT 113
+#define IDD_CLIPMAIN 114
+#define IDD_DEBUGGER 115
+#define IDR_DEBUGGERTOOLBAR 117
+#define IDD_DEBUGGER_TOOLBARBASE 120
+#define IDR_DEBUGGER_VARLIST_MENU 122
+#define IDC_EXEPATH 1000
+#define IDC_PROGRESS 1001
+#define IDC_ERRORLIST 1002
+#define IDC_MESSAGE 1003
+#define IDC_DEBUGLIST 1005
+#define IDC_SHOWERROR 1006
+#define IDC_SHOWDEBUG 1007
+#define IDC_THREADCOMBO 1014
+#define IDC_VARTREE 1015
+#define IDC_GLOBAL 1016
+#define IDC_LOCAL 1017
+#define IDC_PROCCOMBO 1018
+#define IDC_HIDESYSVAR 1019
+#define IDC_STEPIN 1021
+#define IDC_STEPOVER 1022
+#define IDC_ESP 1023
+#define IDC_DUMMYCANCEL 1024
+#define IDC_TAB1 1025
+#define IDC_VARPOS 1029
+#define IDC_WATCHLIST 1033
+#define IDC_STATIC_VERSION 1034
+#define IDC_DEBUG_START 40003
+#define IDC_DEBUG_STEPOVER 40004
+#define IDC_DEBUG_STEPIN 40005
+#define IDM_SHOW_DEFAULTSYSTEM_VAR 40007
+#define IDM_SHOW_RAD_VAR 40008
+#define IDM_SHOW_GUID_VAR 40009
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 125
+#define _APS_NEXT_COMMAND_VALUE 40010
+#define _APS_NEXT_CONTROL_VALUE 1035
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
Index: /BasicCompiler64/stack_frame.cpp
===================================================================
--- /BasicCompiler64/stack_frame.cpp (revision 3)
+++ /BasicCompiler64/stack_frame.cpp (revision 3)
@@ -0,0 +1,138 @@
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+/////////////////////////
+// スタックフレーム管理
+/////////////////////////
+
+CStackFrame::CStackFrame(){
+ lowest_sp=0;
+ now_sp=0;
+ local_parm_size=0;
+ max_parm_size=0;
+}
+CStackFrame::~CStackFrame(){
+ //オブジェクト破棄時に不整合がないかをチェック(バグ回避)
+ error_check();
+}
+void CStackFrame::SetLocalParmSize(int size){
+ local_parm_size=size;
+}
+int CStackFrame::GetFrameSize(){
+ int answer_sp;
+
+ answer_sp=lowest_sp-max_parm_size;
+
+ if((local_parm_size%0x10)==0){
+ if((answer_sp%0x10)==0){
+ //関数のエントリポイントで128ビット境界ラインに合わせるため
+ return -(answer_sp-0x08);
+ }
+ return -(answer_sp-0x10);
+ }
+
+ if((answer_sp%0x10)==0){
+ //関数のエントリポイントで128ビット境界ラインに合わせるため
+ return -(answer_sp-0x10);
+ }
+ return -(answer_sp-0x08);
+}
+void CStackFrame::push(int reg){
+ now_sp-=sizeof(_int64);
+ if(lowest_sp>now_sp) lowest_sp=now_sp;
+
+ if(reg==REG_NON) return;
+
+ //mov qword ptr[rsp+offset],reg
+ op_mov_MR(sizeof(_int64),reg,REG_RSP,now_sp,MOD_BASE_DISP32);
+
+ //スケジュールをセット
+ obp-=sizeof(long);
+ add();
+ obp+=sizeof(long);
+}
+void CStackFrame::push(int xmm_reg,int var_size){
+ now_sp-=sizeof(_int64);
+ if(lowest_sp>now_sp) lowest_sp=now_sp;
+
+ if(var_size==sizeof(double)){
+ //movlpd qword ptr[rsp+offset],xmm_reg
+ op_movlpd_MR(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32);
+ }
+ if(var_size==sizeof(float)){
+ //movss dword ptr[rsp+offset],xmm_reg
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x11;
+ OpBuffer[obp++]=(char)(0x84| REGISTER_OPERAND(xmm_reg)<<3 );
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=now_sp;
+ obp+=sizeof(long);
+ }
+
+ //スケジュールをセット
+ obp-=sizeof(long);
+ add();
+ obp+=sizeof(long);
+}
+void CStackFrame::ref(int reg){
+ //mov reg,qword ptr[rsp+offset] ※スタックフレームを利用
+ op_mov_RM(sizeof(_int64),reg,REG_RSP,now_sp,MOD_BASE_DISP32);
+
+ //スケジュールをセット
+ obp-=sizeof(long);
+ add();
+ obp+=sizeof(long);
+}
+void CStackFrame::ref(int xmm_reg,int var_size){
+ if(var_size==sizeof(double)){
+ //movlpd xmm_reg,qword ptr[rsp+offset]
+ op_movlpd_RM(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32);
+ }
+ if(var_size==sizeof(float)){
+ //movss xmm_reg,dword ptr[rsp+offset]
+ OpBuffer[obp++]=(char)0xF3;
+ OpBuffer[obp++]=(char)0x0F;
+ OpBuffer[obp++]=(char)0x10;
+ OpBuffer[obp++]=(char)(0x84| REGISTER_OPERAND(xmm_reg)<<3 );
+ OpBuffer[obp++]=(char)0x24;
+ *((long *)(OpBuffer+obp))=now_sp;
+ obp+=sizeof(long);
+ }
+
+ //スケジュールをセット
+ obp-=sizeof(long);
+ add();
+ obp+=sizeof(long);
+}
+void CStackFrame::pop(int reg){
+ if(reg!=REG_NON) ref(reg);
+
+ now_sp+=sizeof(_int64);
+}
+void CStackFrame::pop(int xmm_reg,int var_size){
+ ref(xmm_reg,var_size);
+
+ now_sp+=sizeof(_int64);
+}
+void CStackFrame::parameter_allocate(int size){
+ if(max_parm_sizeitem.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,(DWORD64)offset);
+ lptv->item.iImage=1;
+ lptv->item.iSelectedImage=1;
+ hParent=TreeView_InsertItem(hVarTree,lptv);
+
+ VarList_Member(hVarTree,hParent,offset,(CClass *)lpIndex,0);
+ return;
+ }
+ if(type==DEF_PTR_OBJECT){
+ i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes);
+
+ sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_POINTEROFOBJECT,(DWORD64)pData);
+ lptv->item.iImage=4;
+ lptv->item.iSelectedImage=4;
+ hParent=TreeView_InsertItem(hVarTree,lptv);
+
+ if(i2) VarList_Member(hVarTree,hParent,pData,(CClass *)lpIndex,1);
+ return;
+ }
+ else{
+ if(type==DEF_PTR_BYTE){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes)){
+ for(i2=0;;i2++){
+ if(!ReadProcessMemory(hDebugProcess,(void *)(pData+i2),&temporary[i2],1,&stAccBytes)){
+ i2=-1;
+ break;
+ }
+ if(temporary[i2]=='\0') break;
+ if(i2==64){
+ lstrcpy(temporary+i2,"...");
+ break;
+ }
+ }
+ if(i2==-1) sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(DWORD64)pData,(DWORD64)pData);
+ else sprintf(lptv->item.pszText,"%s %d(&H%X) \"%s\"",VarName,(DWORD64)pData,(DWORD64)pData,temporary);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_DOUBLE){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&dbl,sizeof(double),&stAccBytes)){
+ sprintf(lptv->item.pszText,"%s %.15g",VarName,dbl);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_SINGLE){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&flt,sizeof(float),&stAccBytes)){
+ sprintf(lptv->item.pszText,"%s %.6g",VarName,flt);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_INT64){
+ _int64 i64data;
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
+ _i64toa(i64data,temporary,10);
+ _i64toa(i64data,temp2,16);
+ CharUpper(temp2);
+ sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_QWORD||IsPtrType(type)){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
+ _ui64toa(i64data,temporary,10);
+ _ui64toa(i64data,temp2,16);
+ CharUpper(temp2);
+ sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_LONG){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
+ sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,i64data,i64data);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_DWORD){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
+ sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,i64data,i64data);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_INTEGER){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&stAccBytes)){
+ sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(short)wData,(short)wData);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_WORD){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&stAccBytes)){
+ sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,wData,wData);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_CHAR){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&stAccBytes)){
+ temporary[0]=byteData;
+ temporary[1]=0;
+ sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,(char)byteData,byteData,temporary);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ else if(type==DEF_BYTE){
+ if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&stAccBytes)){
+ temporary[0]=byteData;
+ temporary[1]=0;
+ sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,byteData,byteData,temporary);
+ }
+ else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+ }
+ lptv->item.iImage=2;
+ lptv->item.iSelectedImage=2;
+ }
+ TreeView_InsertItem(hVarTree,lptv);
+}
+void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,CClass *pobj_c,BOOL bPtr){
+ int i,i2;
+ char VarData[VN_SIZE],VarName[VN_SIZE];
+ TV_INSERTSTRUCT tv;
+
+ memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+ tv.hInsertAfter=TVI_LAST;
+ tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+ tv.hParent=hParent;
+ tv.item.pszText=VarData;
+
+ for(i=0;iiMemberNum;i++){
+ if(bPtr){
+ lstrcpy(VarName,"->");
+ lstrcat(VarName,pobj_c->ppobj_Member[i]->name);
+ }
+ else{
+ lstrcpy(VarName,".");
+ lstrcat(VarName,pobj_c->ppobj_Member[i]->name);
+ }
+
+ LONG_PTR offset;
+ offset=GetSizeOfClassMember(pobj_c,pobj_c->ppobj_Member[i]->name,&i2);
+
+ if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
+ //構造体内の配列
+ sprintf(VarData,"%s %s(&H%X)",VarName,STRING_ARRAY,pTopOffset+offset);
+ tv.item.iImage=0;
+ tv.item.iSelectedImage=0;
+ hParent=TreeView_InsertItem(hVarTree,&tv);
+
+ i2=VarList_Array(hVarTree,hParent,
+ pTopOffset+offset,
+ pobj_c->ppobj_Member[i]->TypeInfo.type,
+ pobj_c->ppobj_Member[i]->SubScripts,
+ pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
+ }
+ else{
+ //メンバ変数
+ VarList_Insert(hVarTree,
+ &tv,
+ VarName,
+ pobj_c->ppobj_Member[i]->TypeInfo.type,
+ pTopOffset+offset,
+ pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
+ }
+ }
+}
+int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,int type,int *SubScripts,LONG_PTR lpIndex){
+ int i,i2,i3,ElementNum,MemCounter,UseCount[255],TypeSize;
+ char temporary[VN_SIZE],temp2[DIGIT_SIZE];
+
+ TV_INSERTSTRUCT tv;
+ memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+ tv.hInsertAfter=TVI_LAST;
+ tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+ tv.hParent=hParent;
+ tv.item.pszText=temporary;
+
+ TypeSize=GetTypeSize(type,lpIndex);
+
+ for(i=0;i<255;i++){
+ if(SubScripts[i]==-1) break;
+ UseCount[i]=0;
+ }
+ UseCount[i]=-2;
+ MemCounter=0;
+ while(1){
+ UseCount[i]++;
+ for(ElementNum=0;SubScripts[i-ElementNum]ScopeLevel!=0){
+ if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[0] &&
+ pobj_dti->lplpObp[0] < rva_to_real(pVar->ScopeEndAddress)){
+ //範囲内
+ }
+ else{
+ //範囲外
+ continue;
+ }
+ }
+
+
+ if(!pobj_nv->bShow_DefaultSystem_Var){
+ if(memcmp(pVar->name,"_System_",8)==0||
+ memcmp(pVar->name,"_DebugSys_",10)==0||
+ memcmp(pVar->name,"_PromptSys_",11)==0) continue;
+ }
+ if(!pobj_nv->bShow_Rad_Var){
+ if(memcmp(pVar->name,"_RadSys_",8)==0) continue;
+ }
+ if(!pobj_nv->bShow_GUID_Var){
+ if(memcmp(pVar->name,"GUID_",5)==0||
+ memcmp(pVar->name,"IID_",4)==0||
+ memcmp(pVar->name,"CLSID_",6)==0) continue;
+ }
+
+ //静的メンバ
+ if(strstr(pVar->name,".")) continue;
+
+ if(pVar->bArray){
+ sprintf(temporary,"%s %s(&H%X)",
+ pVar->name,
+ STRING_ARRAY,
+ ImageBase+MemPos_RWSection+pVar->offset);
+ tv.item.iImage=0;
+ tv.item.iSelectedImage=0;
+ hParent=TreeView_InsertItem(hVarTree_Global,&tv);
+
+ VarList_Array(hVarTree_Global,hParent,
+ (LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset),
+ pVar->type,
+ pVar->SubScripts,
+ pVar->u.index);
+ }
+ else{
+ VarList_Insert(hVarTree_Global,
+ &tv,
+ pVar->name,
+ pVar->type,
+ (LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset),
+ pVar->u.index);
+ }
+ }
+}
+void RefreshLocalVar(void){
+ int i,i2,i3,sw;
+ char temporary[VN_SIZE];
+ TV_INSERTSTRUCT tv;
+ HTREEITEM hParent;
+ LONG_PTR offset;
+ SIZE_T stAccBytes;
+ LONG_PTR lpData;
+
+ TreeView_DeleteAllItems(hVarTree_Local);
+
+ memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+ tv.hInsertAfter=TVI_LAST;
+ tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+ tv.hParent=TVI_ROOT;
+ tv.item.pszText=temporary;
+
+ extern HANDLE hDebugProcess;
+ extern HWND hDebugWnd;
+ i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+ i2=pobj_dti->iProcLevel-i2;
+
+ if(pobj_dti->lplpSpBase[i2]==0) return;
+
+ extern SUBINFO **ppSubHash;
+ SUBINFO *psi;
+ for(i3=0,sw=0;i3CompileAddress) <= pobj_dti->lplpObp[i2] &&
+ pobj_dti->lplpObp[i2] < rva_to_real(psi->EndOpAddr)){
+ sw=1;
+ break;
+ }
+
+ psi=psi->pNextData;
+ }
+ if(sw) break;
+ }
+ if(!psi) return;
+
+ for(i=0;iVarNum;i++){
+ VARIABLE *pVar=&psi->pVar[i];
+
+ //スコープ外の場合は無視
+ if(pVar->ScopeLevel!=0){
+ if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[i2] &&
+ pobj_dti->lplpObp[i2] < rva_to_real(pVar->ScopeEndAddress)){
+ //範囲内
+ }
+ else{
+ //範囲外
+ continue;
+ }
+ }
+
+ if(pVar->bArray){
+ sprintf(temporary,"%s %s(&H%X)",
+ pVar->name,
+ STRING_ARRAY,
+ pobj_dti->lplpSpBase[i2]+pVar->offset);
+ tv.item.iImage=0;
+ tv.item.iSelectedImage=0;
+ hParent=TreeView_InsertItem(hVarTree_Local,&tv);
+
+ VarList_Array(hVarTree_Local,hParent,
+ pobj_dti->lplpSpBase[i2]+pVar->offset,
+ pVar->type,
+ pVar->SubScripts,
+ pVar->u.index);
+ }
+ else{
+ offset=pobj_dti->lplpSpBase[i2]+pVar->offset;
+ if(pVar->fRef){
+ ReadProcessMemory(hDebugProcess,(void *)offset,&lpData,sizeof(LONG_PTR),&stAccBytes);
+ offset=lpData;
+ }
+ VarList_Insert(hVarTree_Local,&tv,
+ pVar->name,
+ pVar->type,
+ offset,
+ pVar->u.index);
+ }
+ }
+
+
+
+ /////////////////////////////
+ // Thisオブジェクトのリスト
+ /////////////////////////////
+
+ TreeView_DeleteAllItems(hVarTree_This);
+ if(!psi->pobj_ParentClass) return;
+
+ //Thisポインタを取得
+ LONG_PTR pThis;
+ for(i=0;iVarNum;i++){
+ if(lstrcmp(psi->pVar[i].name,"_System_LocalThis")==0) break;
+ }
+ if(i==psi->VarNum) return;
+ lpData=pobj_dti->lplpSpBase[i2]+psi->pVar[i].offset;
+ ReadProcessMemory(hDebugProcess,(void *)lpData,&pThis,sizeof(LONG_PTR),&stAccBytes);
+
+ for(i=0;ipobj_ParentClass->iMemberNum;i++){
+ offset=GetSizeOfClassMember(psi->pobj_ParentClass,psi->pobj_ParentClass->ppobj_Member[i]->name,&i2);
+
+ if(psi->pobj_ParentClass->ppobj_Member[i]->SubScripts[0]!=-1){
+ //配列
+ sprintf(temporary,"%s %s(&H%X)",
+ psi->pobj_ParentClass->ppobj_Member[i]->name,
+ STRING_ARRAY,
+ (DWORD64)offset);
+ tv.item.iImage=0;
+ tv.item.iSelectedImage=0;
+ hParent=TreeView_InsertItem(hVarTree_This,&tv);
+
+ VarList_Array(hVarTree_This,hParent,
+ pThis+offset,
+ psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.type,
+ psi->pobj_ParentClass->ppobj_Member[i]->SubScripts,
+ psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.u.lpIndex);
+ }
+ else{
+ VarList_Insert(hVarTree_This,&tv,
+ psi->pobj_ParentClass->ppobj_Member[i]->name,
+ psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.type,
+ pThis+offset,
+ psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.u.lpIndex);
+ }
+ }
+}
+void RefreshGlobalVar_with_WindowLock(void){
+ extern HWND hDebugWnd;
+
+ //処理時間を短くするため、一時的に非表示にする
+ LockWindowUpdate(hDebugWnd);
+ ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
+
+ //リフレッシュ
+ RefreshGlobalVar();
+
+ LockWindowUpdate(NULL);
+ ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
+}
+void RefreshLocalVar_with_WindowLock(void){
+ extern HWND hDebugWnd;
+
+ //処理時間を短くするため、一時的に非表示にする
+ LockWindowUpdate(hDebugWnd);
+ ShowWindow(GetParent(hVarTree_Local),SW_HIDE);
+
+ //リフレッシュ
+ RefreshLocalVar();
+
+ LockWindowUpdate(NULL);
+ ShowWindow(GetParent(hVarTree_Local),SW_SHOW);
+}
+
+void SetCalcToWatchList(HWND hListView,int iItem,char *buffer){
+ int i;
+ char temporary[255],temp2[255];
+
+ //エスケープシーケンスをセット
+ SetEscapeSequenceFormat(buffer);
+
+ KillStringSpaces(buffer);
+
+ //カッコを相互チェック
+ if(!CheckParenthesis2(buffer)){
+ ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
+ return;
+ }
+
+ double dbl;
+ _int64 i64data;
+ i=StaticCalculation(true, buffer,0,&i64data,0,1);
+ if(IsRealNumberType(i)){
+ memcpy(&dbl,&i64data,sizeof(double));
+ }
+
+ if(i==0){
+ ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
+ }
+ else if(i==-1){
+ ListView_SetItemText(hListView,iItem,1,"アクセスできません");
+ }
+ else{
+ if(IsRealNumberType(i))
+ sprintf(temporary,"%.15g (&H%08X)",dbl,(int)dbl);
+ else if(Is64Type(i)){
+ _i64toa(i64data,temporary,10);
+ _i64toa(i64data,temp2,16);
+ CharUpper(temp2);
+ sprintf(temporary+lstrlen(temporary)," (&H%s)",temp2);
+ }
+ else sprintf(temporary,"%d (&H%08X)",(long)i64data,(long)i64data);
+
+ ListView_SetItemText(hListView,iItem,1,temporary);
+ }
+}
+void RefreshWatchList(void){
+ extern HWND hDebugWnd;
+ HWND hListView;
+ int i,i2;
+ char temporary[VN_SIZE];
+
+ hListView=GetDlgItem(hDebugWnd,IDC_WATCHLIST);
+ i2=ListView_GetItemCount(hListView);
+ for(i=0;iiProcLevel+1;i3++){
+ for(i2=0;i2lplpObp[i3]&&
+ pobj_dti->lplpObp[i3]<=(DWORD64)(pLineInfo[i2+1].TopObp+ImageBase+MemPos_CodeSection)) break;
+ }
+ if(i2==MaxLineInfoNum) pobj_dti->lpdwCp[i3]=-1;
+ else pobj_dti->lpdwCp[i3]=pLineInfo[i2].TopCp;
+ }
+ for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
+ if(pobj_dti->lpdwCp[i3]==-1){
+ pobj_dti->iProcLevel--;
+ for(i2=i3;i2<(int)pobj_dti->iProcLevel+1;i2++){
+ pobj_dti->lplpObp[i2]=pobj_dti->lplpObp[i2+1];
+ pobj_dti->lplpSpBase[i2]=pobj_dti->lplpSpBase[i2+1];
+ pobj_dti->lpdwCp[i2]=pobj_dti->lpdwCp[i2+1];
+ }
+ i3--;
+ continue;
+ }
+ }
+
+ if(!GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel],&i2,temporary)){
+ extern HWND hMainDlg;
+ //"デバッグ情報の取得に失敗"
+ MessageBox(hMainDlg,STRING_DEBUG_FAILED,"ActiveBasic error",MB_OK);
+ return 0;
+ }
+ ShowErrorLine(i2,temporary);
+
+ //プロシージャ コンボボックス
+ extern SUBINFO **ppSubHash;
+ SUBINFO *psi;
+ int sw;
+ SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
+ for(i2=pobj_dti->iProcLevel;i2>=0;i2--){
+ for(i3=0,sw=0;i3CompileAddress) <= pobj_dti->lplpObp[i2] &&
+ pobj_dti->lplpObp[i2] < rva_to_real(psi->EndOpAddr)){
+ lstrcpy(temporary,psi->name);
+ sw=1;
+ break;
+ }
+ psi=psi->pNextData;
+ }
+ if(sw) break;
+ }
+ if(!psi){
+ if(i2==0){
+ lstrcpy(temporary,"Global");
+ pobj_dti->lplpSpBase[i2]=0;
+ }
+ else lstrcpy(temporary,"error");
+ }
+ SendMessage(hProcCombo,CB_ADDSTRING,0,(LPARAM)temporary);
+ }
+ SendMessage(hProcCombo,CB_SETCURSEL,0,0);
+
+ return pobj_dti->iProcLevel;
+}
+
+//IDC_THREADCOMBOプロシージャ
+LRESULT CALLBACK ThreadComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern WNDPROC OldThreadComboProc;
+ int i2;
+ DWORD dwThreadID;
+ char temporary[255];
+
+ switch(message){
+ case WM_COMMAND:
+ if(HIWORD(wParam)==CBN_SELCHANGE){
+ SendMessage(hwnd,CB_GETLBTEXT,SendMessage(hwnd,CB_GETCURSEL,0,0),(LPARAM)temporary);
+ sscanf(temporary+2,"%X",&dwThreadID);
+
+ extern DWORD _DebugSys_dwThreadID[256];
+ i2=0;
+ while(_DebugSys_dwThreadID[i2]!=dwThreadID) i2++;
+
+ //次回のステップ実行対象を指定
+ extern int NextStepThreadNum;
+ NextStepThreadNum=i2;
+
+ //スレッド情報をリフレッシュ
+ pobj_dti->Reflesh(i2);
+
+ SetDebugProcCombo(GetDlgItem(GetParent(hwnd),IDC_PROCCOMBO));
+
+ SendDlgItemMessage(GetParent(hwnd),IDC_PROCCOMBO,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
+ }
+ break;
+ }
+ return CallWindowProc(OldThreadComboProc,hwnd,message,wParam,lParam);
+}
+//IDC_PROCCOMBOプロシージャ
+LRESULT CALLBACK ProcComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern WNDPROC OldProcComboProc;
+ int i2,i3;
+ char temporary[MAX_PATH];
+
+ switch(message){
+ case WM_COMMAND:
+ if(HIWORD(wParam)==CBN_SELCHANGE){
+ i2=(int)SendMessage(hwnd,CB_GETCURSEL,0,0);
+ GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel-i2],&i3,temporary);
+ ShowErrorLine(i3,temporary);
+
+ RefreshLocalVar_with_WindowLock();
+ }
+ break;
+ }
+ return CallWindowProc(OldProcComboProc,hwnd,message,wParam,lParam);
+}
+void InitVarList(DWORD dwThreadId){
+ extern HWND hDebugWnd;
+ int i2,i3,i5;
+ char temporary[255];
+
+
+ //スレッド
+ SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_RESETCONTENT,0,0);
+ extern DWORD _DebugSys_dwThreadID[256];
+ for(i2=0;i2<256;i2++){
+ if(_DebugSys_dwThreadID[i2]){
+ sprintf(temporary,"&H%08X",_DebugSys_dwThreadID[i2]);
+ SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_ADDSTRING,0,(LPARAM)temporary);
+ if(_DebugSys_dwThreadID[i2]==dwThreadId){
+ extern int NextStepThreadNum;
+ NextStepThreadNum=i2;
+ }
+ }
+ }
+ sprintf(temporary,"&H%08X",dwThreadId);
+ i5=(int)SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_FINDSTRING,0,(LPARAM)temporary);
+ SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_SETCURSEL,i5,0);
+
+ i2=SetDebugProcCombo(GetDlgItem(hDebugWnd,IDC_PROCCOMBO));
+
+
+ ///////////////////////////////////////////////
+ // 実行中のプロシージャのローカル変数をセット
+ ///////////////////////////////////////////////
+
+ extern VARIABLE *LocalVar;
+ extern int MaxLocalVarNum;
+ int sw;
+
+ MaxLocalVarNum=0;
+
+ i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+ i2=pobj_dti->iProcLevel-i2;
+
+ if(pobj_dti->lplpSpBase[i2]){
+ extern SUBINFO **ppSubHash;
+ SUBINFO *psi;
+ for(i3=0,sw=0;i3CompileAddress) <= pobj_dti->lplpObp[i2] &&
+ pobj_dti->lplpObp[i2] < rva_to_real(psi->EndOpAddr)){
+ sw=1;
+ break;
+ }
+
+ psi=psi->pNextData;
+ }
+ if(sw) break;
+ }
+
+
+ if(psi){
+ LocalVar=psi->pVar;
+ MaxLocalVarNum=psi->VarNum;
+
+ pobj_CompilingClass=psi->pobj_ParentClass;
+ }
+ }
+
+
+ ////////////////////////
+ // 変数リストを再表示
+ ////////////////////////
+
+ //処理時間を短くするため、一時的に非表示にする
+ LockWindowUpdate(hDebugWnd);
+ ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
+ ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_HIDE);
+
+ //リフレッシュ
+ RefreshLocalVar();
+ RefreshGlobalVar();
+ RefreshWatchList();
+
+ LockWindowUpdate(NULL);
+ ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
+ ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_SHOW);
+}
+
+
+
+
+//////////////////////////////////////
+// エディタに埋め込み表示のデバッガ
+//////////////////////////////////////
+
+BOOL CALLBACK DebuggerButtonsProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern HINSTANCE hInst;
+ extern DWORD dwStepRun;
+
+ //デバッガ用ツールバー
+#define BMPNUM_DEBUGGERTOOLBAR 3
+#define BTNNUM_DEBUGGERTOOLBAR 4
+ TBBUTTON DebuggerToolBar[]={
+ {0,IDC_DEBUG_START,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+ {0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
+ {1,IDC_DEBUG_STEPOVER,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+ {2,IDC_DEBUG_STEPIN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+ };
+ TOOLTIPTEXT *pTipText;
+
+ static HIMAGELIST hImageList,hImageList_Disabled;
+
+ switch(message){
+ case WM_INITDIALOG:
+ //ツールバーを生成
+ extern HWND hDebuggerToolbar;
+ hDebuggerToolbar=CreateToolbarEx(hwnd,WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|WS_CLIPSIBLINGS,
+ NULL,
+ 0,0,0,
+ DebuggerToolBar,
+ BTNNUM_DEBUGGERTOOLBAR, /*アイテムの個数*/
+ 0,0,16,15,sizeof(TBBUTTON));
+
+ hImageList = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR),
+ 16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
+ SendMessage(hDebuggerToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
+ hImageList_Disabled = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR_DISABLED),
+ 16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
+ SendMessage(hDebuggerToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList_Disabled);
+
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDC_DEBUG_START:
+ DestroyWindow(GetParent(hwnd));
+ return 1;
+ case IDC_DEBUG_STEPIN:
+ dwStepRun=1;
+ return 1;
+ case IDC_DEBUG_STEPOVER:
+ dwStepRun=2;
+ return 1;
+ }
+ break;
+ case WM_NOTIFY:
+ pTipText=(TOOLTIPTEXT *)lParam;
+ if(pTipText->hdr.code==TTN_NEEDTEXT){
+ //ツールチップを表示
+ switch(pTipText->hdr.idFrom){
+ case IDC_DEBUG_START:
+ pTipText->lpszText="実行";
+ break;
+ case IDC_DEBUG_STEPOVER:
+ pTipText->lpszText="ステップ アウト";
+ break;
+ case IDC_DEBUG_STEPIN:
+ pTipText->lpszText="ステップ イン";
+ break;
+ }
+ }
+ break;
+ case WM_SIZE:
+ MoveWindow(hDebuggerToolbar,0,0,LOWORD(lParam),HIWORD(lParam),1);
+ return 1;
+
+ case WM_DESTROY:
+ ImageList_Destroy(hImageList);
+ ImageList_Destroy(hImageList_Disabled);
+ return 1;
+ }
+ return 0;
+}
+
+WNDPROC OldTabProc;
+LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern HINSTANCE hInst;
+
+ static HMENU hDummyMenu,hMenu=0;
+
+ switch(message){
+ case WM_CONTEXTMENU:
+ if(hMenu==0){
+ hDummyMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_DEBUGGER_VARLIST_MENU));
+ hMenu=GetSubMenu(hDummyMenu,0);
+ }
+
+ MENUITEMINFO mi;
+ mi.cbSize=sizeof(MENUITEMINFO);
+ mi.fMask=MIIM_STATE;
+ mi.fState=MFS_CHECKED;
+
+ if(pobj_nv->bShow_DefaultSystem_Var)
+ SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
+ if(pobj_nv->bShow_Rad_Var)
+ SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
+ if(pobj_nv->bShow_GUID_Var)
+ SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
+
+ TrackPopupMenu(hMenu,TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+
+ break;
+ case WM_COMMAND:
+ mi.cbSize=sizeof(MENUITEMINFO);
+ mi.fMask=MIIM_STATE;
+ switch(LOWORD(wParam)){
+ case IDM_SHOW_DEFAULTSYSTEM_VAR:
+ if(pobj_nv->bShow_DefaultSystem_Var){
+ pobj_nv->bShow_DefaultSystem_Var=0;
+ mi.fState=MFS_UNCHECKED;
+ }
+ else{
+ pobj_nv->bShow_DefaultSystem_Var=1;
+ mi.fState=MFS_CHECKED;
+ }
+ SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
+ RefreshGlobalVar_with_WindowLock();
+ break;
+ case IDM_SHOW_RAD_VAR:
+ if(pobj_nv->bShow_Rad_Var){
+ pobj_nv->bShow_Rad_Var=0;
+ mi.fState=MFS_UNCHECKED;
+ }
+ else{
+ pobj_nv->bShow_Rad_Var=1;
+ mi.fState=MFS_CHECKED;
+ }
+ SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
+ RefreshGlobalVar_with_WindowLock();
+ break;
+ case IDM_SHOW_GUID_VAR:
+ if(pobj_nv->bShow_GUID_Var){
+ pobj_nv->bShow_GUID_Var=0;
+ mi.fState=MFS_UNCHECKED;
+ }
+ else{
+ pobj_nv->bShow_GUID_Var=1;
+ mi.fState=MFS_CHECKED;
+ }
+ SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
+ RefreshGlobalVar_with_WindowLock();
+ break;
+ }
+ break;
+ case WM_DESTROY:
+ DestroyMenu(hMenu);
+ hMenu=0;
+ break;
+ }
+ return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
+}
+
+BOOL CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern HANDLE hHeap;
+ extern HINSTANCE hInst;
+ extern DWORD dwStepRun;
+ extern double width_ratio_VarList;
+ RECT rect;
+ int i,i2,i3;
+ char temporary[VN_SIZE];
+ LV_DISPINFO *lvinfo;
+ LVITEM ListView_Item;
+
+ static POINT pos_VarList;
+ static POINT pos_WatchList;
+
+ switch(message){
+ case WM_INITDIALOG:
+ extern HWND hDebugWnd;
+ hDebugWnd=hwnd;
+
+ //変数リストの初期位置を取得
+ GetWindowRect(GetDlgItem(hwnd,IDC_VARPOS),&rect);
+ pos_VarList.x=rect.left;
+ pos_VarList.y=rect.top;
+ ScreenToClient(hwnd,&pos_VarList);
+
+ //ウォッチリストの初期位置を取得
+ pos_WatchList.x=pos_VarList.x+(rect.right-rect.left)+LEVER_THICK;
+ pos_WatchList.y=0;
+
+ //ツールバーのベースウィンドウを生成
+ static HWND hBase_ToolBar;
+ hBase_ToolBar=CreateDialog(hInst,MAKEINTRESOURCE(IDD_DEBUGGER_TOOLBARBASE),hwnd,(DLGPROC)DebuggerButtonsProc);
+ MoveWindow(hBase_ToolBar,50,0,20*BTNNUM_DEBUGGERTOOLBAR,22,1);
+
+ extern WNDPROC OldThreadComboProc;
+ OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
+ SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
+
+ extern WNDPROC OldProcComboProc;
+ OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
+ SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
+
+
+ ///////////////////////////
+ // タブコントロールを生成
+ ///////////////////////////
+
+ static HWND hTab;
+ HFONT hFont;
+ hFont=(HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
+ hTab=CreateWindow(WC_TABCONTROL,NULL,
+ WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
+ 0,0,0,0,hwnd,0,hInst,0);
+ SendMessage(hTab,WM_SETFONT,(WPARAM)hFont,0);
+ OldTabProc=(WNDPROC)GetWindowLongPtr(hTab,GWLP_WNDPROC);
+ SetWindowLongPtr(hTab,GWLP_WNDPROC,(LONG_PTR)TabProc);
+
+ //タブを設定
+ TC_ITEM tcItem;
+ tcItem.mask=TCIF_TEXT;
+ tcItem.pszText="グローバル";
+ SendMessage(hTab,TCM_INSERTITEM,0,(LPARAM)&tcItem);
+ tcItem.mask=TCIF_TEXT;
+ tcItem.pszText="ローカル";
+ SendMessage(hTab,TCM_INSERTITEM,1,(LPARAM)&tcItem);
+ tcItem.mask=TCIF_TEXT;
+ tcItem.pszText="This";
+ SendMessage(hTab,TCM_INSERTITEM,2,(LPARAM)&tcItem);
+
+ //グローバル変数リストのツリーを作成
+ hVarTree_Global=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+ WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+ 0,0,0,0,
+ hTab,0,hInst,0);
+
+ //ローカル変数リストのツリーを作成
+ hVarTree_Local=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+ WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+ 0,0,0,0,
+ hTab,0,hInst,0);
+
+ //This変数リストのツリーを作成
+ hVarTree_This=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+ WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+ 0,0,0,0,
+ hTab,0,hInst,0);
+
+ ShowWindow(hVarTree_Global,SW_SHOW);
+
+
+ //イメージリスト読み込み、設定
+ static HIMAGELIST hVariOrderImageList;
+ hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
+ TreeView_SetImageList(hVarTree_Global,hVariOrderImageList,TVSIL_NORMAL);
+ TreeView_SetImageList(hVarTree_Local,hVariOrderImageList,TVSIL_NORMAL);
+ TreeView_SetImageList(hVarTree_This,hVariOrderImageList,TVSIL_NORMAL);
+
+
+ /////////////////////////
+ // ウォッチリスト
+ /////////////////////////
+
+ //コラムの設定
+ static HWND hListView;
+ LV_COLUMN ListView_Column;
+ DWORD dwStyle;
+
+ hListView=GetDlgItem(hwnd,IDC_WATCHLIST);
+ GetClientRect(hListView,&rect);
+ dwStyle=ListView_GetExtendedListViewStyle(hListView);
+ dwStyle|=LVS_EX_FULLROWSELECT;
+ ListView_SetExtendedListViewStyle(hListView,dwStyle);
+
+ ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+ ListView_Column.fmt=LVCFMT_LEFT;
+
+ extern int width_WatchColumn_Expression;
+ ListView_Column.cx=width_WatchColumn_Expression;
+ ListView_Column.pszText="ウォッチ式";
+ ListView_Column.iSubItem=0;
+ ListView_InsertColumn(hListView,0,&ListView_Column);
+
+ extern int width_WatchColumn_Value;
+ ListView_Column.cx=width_WatchColumn_Value;
+ ListView_Column.pszText="値";
+ ListView_Column.iSubItem=1;
+ ListView_InsertColumn(hListView,1,&ListView_Column);
+
+ //アイテムの設定
+ ListView_Item.mask=LVIF_TEXT;
+ ListView_Item.iSubItem=0;
+ for(i=0;iWatchNum;i++){
+ ListView_Item.pszText=pobj_nv->ppWatchStr[i];
+ ListView_Item.iItem=i;
+ ListView_InsertItem(hListView,&ListView_Item);
+ }
+ ListView_Item.pszText="...";
+ ListView_Item.iItem=i;
+ ListView_InsertItem(hListView,&ListView_Item);
+
+
+ ///////////////////////
+ // 変数リストの初期化
+ ///////////////////////
+ InitVarList((DWORD)lParam);
+
+ break;
+ case WM_NOTIFY:
+ NMHDR *hdr;
+ hdr=(NMHDR *)lParam;
+ if(hdr->hwndFrom==hTab&&hdr->code==TCN_SELCHANGE){
+ i=TabCtrl_GetCurSel(hTab);
+
+ if(i==0){
+ //グローバル変数を表示
+ ShowWindow(hVarTree_Global,SW_SHOW);
+ ShowWindow(hVarTree_Local,SW_HIDE);
+ ShowWindow(hVarTree_This,SW_HIDE);
+ }
+ else if(i==1){
+ //ローカル変数を表示
+ ShowWindow(hVarTree_Global,SW_HIDE);
+ ShowWindow(hVarTree_Local,SW_SHOW);
+ ShowWindow(hVarTree_This,SW_HIDE);
+ }
+ else if(i==2){
+ //This変数を表示
+ ShowWindow(hVarTree_Global,SW_HIDE);
+ ShowWindow(hVarTree_Local,SW_HIDE);
+ ShowWindow(hVarTree_This,SW_SHOW);
+ }
+ }
+
+ if(hdr->hwndFrom==hListView){
+ lvinfo=(LV_DISPINFO *)hdr;
+ if(hdr->code==NM_DBLCLK){
+ i2=ListView_GetItemCount(hListView);
+ for(i=0;icode==LVN_BEGINLABELEDIT){
+ hEdit=ListView_GetEditControl(hListView);
+
+ GetWindowText(hEdit,temporary,VN_SIZE);
+ if(lstrcmp(temporary,"...")==0) SetWindowText(hEdit,"");
+ }
+ if(hdr->code==LVN_ENDLABELEDIT){
+ GetWindowText(hEdit,temporary,VN_SIZE);
+ if(temporary[0]=='\0'){
+ if(ListView_GetItemCount(hListView)-1==lvinfo->item.iItem) break;
+
+ //空白入力の場合はそのアイテムを削除する
+ ListView_DeleteItem(hListView,lvinfo->item.iItem);
+ break;
+ }
+ ListView_SetItemText(hListView,lvinfo->item.iItem,0,temporary);
+
+ //演算結果を表示
+ SetCalcToWatchList(hListView,lvinfo->item.iItem,temporary);
+
+ if(lvinfo->item.iItem==ListView_GetItemCount(hListView)-1){
+ //リストアイテムを追加
+ ListView_Item.mask=LVIF_TEXT;
+ ListView_Item.pszText="...";
+ ListView_Item.iItem=lvinfo->item.iItem+1;
+ ListView_Item.iSubItem=0;
+ ListView_InsertItem(hListView,&ListView_Item);
+ }
+ }
+
+ if(hdr->code==LVN_KEYDOWN){
+ LV_KEYDOWN *plvKeydown;
+ plvKeydown=(LV_KEYDOWN *)hdr;
+ if(plvKeydown->wVKey==VK_DELETE){
+ i2=ListView_GetItemCount(hListView);
+ for(i=i2-2;i>=0;i--){
+ if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
+ ListView_DeleteItem(hListView,i);
+ i3=i;
+ }
+ }
+
+ ListView_SetItemState(hListView,i3,LVIS_SELECTED,LVIS_SELECTED);
+ }
+ }
+ }
+ break;
+
+ case WM_SIZE:
+ //変数リストの位置
+ int width_VarList;
+ width_VarList=
+ (int)((double)(LOWORD(lParam)-pos_VarList.x)*width_ratio_VarList);
+
+ MoveWindow(hTab,
+ pos_VarList.x,
+ pos_VarList.y,
+ width_VarList,
+ HIWORD(lParam)-pos_VarList.y,
+ 1);
+
+ GetClientRect(hTab,&rect);
+ TabCtrl_AdjustRect(hTab,FALSE,&rect);
+ rect.left-=2;
+ rect.right++;
+ rect.bottom++;
+
+ MoveWindow(hVarTree_Global,
+ rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+ MoveWindow(hVarTree_Local,
+ rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+ MoveWindow(hVarTree_This,
+ rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+
+ pos_WatchList.x=pos_VarList.x+width_VarList+LEVER_THICK;
+ pos_WatchList.y=0;
+
+ //ウォッチリストの位置
+ MoveWindow(GetDlgItem(hwnd,IDC_WATCHLIST),
+ pos_WatchList.x,
+ pos_WatchList.y,
+ LOWORD(lParam)-pos_WatchList.x,
+ HIWORD(lParam)-pos_WatchList.y,
+ 1);
+
+ return 1;
+
+ case WM_VARLIST_CLOSE:
+ DestroyWindow(hwnd);
+ return 1;
+ case WM_DESTROY:
+ ImageList_Destroy(hVariOrderImageList);
+
+
+ //////////////////////////////////////////////////////////////
+ // ウォッチリストの以前の内容を破棄し、新しい内容に書き換える
+ //////////////////////////////////////////////////////////////
+
+ for(i=0;iWatchNum;i++){
+ HeapDefaultFree(pobj_nv->ppWatchStr[i]);
+ }
+ HeapDefaultFree(pobj_nv->ppWatchStr);
+
+ pobj_nv->WatchNum=ListView_GetItemCount(hListView)-1;
+ pobj_nv->ppWatchStr=(char **)HeapAlloc(hHeap,0,pobj_nv->WatchNum*sizeof(char *)+1);
+ for(i=0;iWatchNum;i++){
+ ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
+ pobj_nv->ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+ lstrcpy(pobj_nv->ppWatchStr[i],temporary);
+ }
+
+
+ //////////////////////////////
+ // デバッグダイアログを破棄
+ //////////////////////////////
+
+ hDebugWnd=0;
+
+ extern BOOL bClipCompileView;
+ if(bClipCompileView){
+ extern HWND hOwnerEditor;
+ SendMessage(hOwnerEditor,WM_DESTROYDEBUGGERVIEW,0,0);
+ }
+
+ return 1;
+
+
+
+ ///////////////////////
+ // デバッグコマンド
+ ///////////////////////
+
+ case WM_DEBUG_CONTINUE:
+ DestroyWindow(hwnd);
+ return 1;
+ case WM_STEP_IN:
+ Debugger_StepIn();
+ return 1;
+ case WM_STEP_OVER:
+ Debugger_StepOver();
+ return 1;
+ case WM_STEP_CURSOR:
+ Debugger_StepCursor();
+ return 1;
+ }
+ return 0;
+}
+
+
+
+
+//////////////////////////////////
+// ポップアップ表示の変数リスト
+//////////////////////////////////
+
+BOOL CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern HANDLE hHeap;
+ extern HINSTANCE hInst;
+ extern DWORD dwStepRun;
+ RECT rect;
+ POINT pos;
+ SIZE size;
+
+ switch(message){
+ case WM_INITDIALOG:
+ extern HWND hDebugWnd;
+ hDebugWnd=hwnd;
+
+ pos.x=pobj_nv->VarDlgRect.left;
+ pos.y=pobj_nv->VarDlgRect.top;
+ size.cx=pobj_nv->VarDlgRect.right-pobj_nv->VarDlgRect.left;
+ size.cy=pobj_nv->VarDlgRect.bottom-pobj_nv->VarDlgRect.top;
+ MoveWindow(hwnd,pos.x,pos.y,size.cx,size.cy,1);
+
+ extern WNDPROC OldThreadComboProc;
+ OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
+ SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
+
+ extern WNDPROC OldProcComboProc;
+ OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
+ SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
+
+ //イメージリスト読み込み、設定
+ static HIMAGELIST hVariOrderImageList;
+ hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
+ ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
+ TreeView_SetImageList(GetDlgItem(hwnd,IDC_VARTREE),hVariOrderImageList,TVSIL_NORMAL);
+
+ InitVarList((DWORD)lParam);
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDCANCEL:
+ DestroyWindow(hwnd);
+ return 1;
+ case IDC_STEPIN:
+ dwStepRun=1;
+ return 1;
+ case IDC_STEPOVER:
+ dwStepRun=2;
+ return 1;
+ }
+ break;
+ case WM_SIZE:
+ GetWindowRect(GetDlgItem(hwnd,IDC_VARTREE),&rect);
+ pos.x=rect.left;
+ pos.y=rect.top;
+ ScreenToClient(hwnd,&pos);
+ MoveWindow(GetDlgItem(hwnd,IDC_VARTREE),0,pos.y,LOWORD(lParam),HIWORD(lParam)-pos.y,TRUE);
+ SetWindowPos(GetDlgItem(hwnd,IDCANCEL),0,LOWORD(lParam)-91,9,0,0,SWP_NOSIZE);
+ return 1;
+ case WM_VARLIST_CLOSE:
+ DestroyWindow(hwnd);
+ return 1;
+ case WM_DESTROY:
+ ImageList_Destroy(hVariOrderImageList);
+
+ GetWindowRect(hwnd,&pobj_nv->VarDlgRect);
+
+ hDebugWnd=0;
+
+ return 1;
+ }
+ return 0;
+}
Index: /ProjectEditor/Attach.cpp
===================================================================
--- /ProjectEditor/Attach.cpp (revision 3)
+++ /ProjectEditor/Attach.cpp (revision 3)
@@ -0,0 +1,328 @@
+#ifndef THETEXT
+
+#include "common.h"
+#include
+#include
+
+#pragma comment(lib, "psapi.lib")
+
+
+int GetSelectingProcessId(HWND hListView,DWORD *lpdwPlatform){
+ int nCount;
+ nCount=ListView_GetItemCount(hListView);
+
+ char temporary[255];
+ DWORD dwProcessId;
+ int i;
+ for(i=0;ihdr.hwndFrom==hListView){
+ if(nmListView->hdr.code==NM_DBLCLK){
+ if(nmListView->iItem==-1) return 1;
+ SendMessage(hwnd,WM_COMMAND,IDOK,0);
+ return 1;
+ }
+ }
+ break;
+
+ case WM_DESTROY:
+ ImageList_Destroy(hImageList);
+ return 1;
+ }
+ return 0;
+}
+
+
+#endif //THETEXT
Index: /ProjectEditor/Attach.h
===================================================================
--- /ProjectEditor/Attach.h (revision 3)
+++ /ProjectEditor/Attach.h (revision 3)
@@ -0,0 +1,2 @@
+
+BOOL CALLBACK DlgAttach(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
Index: /ProjectEditor/BREGEXP.H
===================================================================
--- /ProjectEditor/BREGEXP.H (revision 3)
+++ /ProjectEditor/BREGEXP.H (revision 3)
@@ -0,0 +1,77 @@
+/*
+Visual Basic からお使いのときは次のDeclare文を使ってください。
+Private Declare Function Match Lib "bregexp" _
+ (szRegstr As String, szTarget As String) As String
+
+
+Private Declare Function Replace Lib "bregexp" _
+ (szRegstr As String, szTarget As String) As String
+
+Private Declare Function Translate Lib "bregexp" _
+ (szRegstr As String, szTarget As String, ret As String) As Long
+
+Private Declare Function Split Lib "bregexp" _
+ (szRegstr As String, szTarget As String, limit As Long) As Variant
+
+Private Declare Function MatchEx Lib "bregexp" _
+ (szRegstr As String, szTarget As String, mode As Long) As Variant
+
+*/
+
+
+#ifdef _BREGEXP_
+#define BREGEXPAPI __declspec(dllexport)
+#else
+#define BREGEXPAPI __declspec(dllimport)
+#endif
+
+typedef struct bregexp {
+ const char *outp; /* result string start ptr */
+ const char *outendp; /* result string end ptr */
+ const int splitctr; /* split result counter */
+ const char **splitp; /* split result pointer ptr */
+ int rsv1; /* reserved for external use */
+} BREGEXP;
+
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+
+typedef BREGEXPAPI int (*PFUNC_BMatch)(char* str,char *target,char *targetendp,
+ BREGEXP **rxp,char *msg) ;
+typedef BREGEXPAPI int (*PFUNC_BSubst)(char* str,char *target,char *targetendp,
+ BREGEXP **rxp,char *msg) ;
+typedef BREGEXPAPI int (*PFUNC_BTrans)(char* str,char *target,char *targetendp,
+ BREGEXP **rxp,char *msg) ;
+typedef BREGEXPAPI int (*PFUNC_BSplit)(char* str,char *target,char *targetendp,
+ int limit,BREGEXP **rxp,char *msg);
+typedef BREGEXPAPI void (*PFUNC_BRegfree)(BREGEXP* rx);
+
+typedef BREGEXPAPI char *(*PFUNC_BRegexpVersion)(void);
+
+
+class CRegExp{
+ HINSTANCE hLib;
+public:
+ CRegExp();
+ ~CRegExp();
+ PFUNC_BMatch BMatch;
+ PFUNC_BSubst BSubst;
+ PFUNC_BTrans BTrans;
+ PFUNC_BSplit BSplit;
+ PFUNC_BRegfree BRegfree;
+ PFUNC_BRegexpVersion BRegexpVersion;
+
+ char *compare(HWND hFindDlg,char *buffer,char *exp,BOOL IsBigSmall,int *pLength);
+ char *GetPermuStr(HWND hFindDlg,char *buffer,char *exp,char *szPermu,BOOL IsBigSmall);
+};
+extern CRegExp obj_RegExp;
+
+
+#if defined(__cplusplus)
+}
+#endif
+
+
+#undef BREGEXPAPI
Index: /ProjectEditor/Backup.cpp
===================================================================
--- /ProjectEditor/Backup.cpp (revision 3)
+++ /ProjectEditor/Backup.cpp (revision 3)
@@ -0,0 +1,204 @@
+#include "common.h"
+
+
+char szBackupDirPath[MAX_PATH];
+
+void CreateBackupDir(void){
+ //自動バックアップ用のフォルダを取得
+ extern char szBackupDirPath[MAX_PATH];
+ GUID guid;
+ char *temp2;
+ CoCreateGuid(&guid);
+ UuidToString(&guid,(unsigned char **)&temp2);
+
+ char temporary[MAX_PATH];
+ GetTempPath(MAX_PATH,temporary);
+ ShortPathToLongPath(temporary,szBackupDirPath);
+ if(szBackupDirPath[lstrlen(szBackupDirPath)-1]!='\\') lstrcat(szBackupDirPath,"\\");
+
+#ifdef THETEXT
+ lstrcat(szBackupDirPath,"TheText_Temporary_");
+#else
+ lstrcat(szBackupDirPath,"ProjectEditor_Temporary_");
+#endif
+ lstrcat(szBackupDirPath,temp2);
+ RpcStringFree((unsigned char **)&temp2);
+
+ CreateDirectory(szBackupDirPath,NULL);
+ lstrcat(szBackupDirPath,"\\");
+}
+
+
+void backup(void *dummy){
+ extern char szBackupDirPath[MAX_PATH];
+ int i,iNum=0;
+ char temporary[MAX_PATH];
+
+ char *temp2;
+ temp2=(char *)malloc(8192);
+ sprintf(temp2,"%x\r\n",hOwner);
+
+ for(i=0;ibuffer,lstrlen(MdiInfo[WndNum].pmti->buffer));
+
+ //情報を追加
+ sprintf(temp2+lstrlen(temp2),"%s\r\n",MdiInfo[WndNum].path);
+
+ iNum++;
+ }
+ }
+
+ //バックアップヘッダ
+ sprintf(temporary,"%sinfo.txt",szBackupDirPath);
+ WriteBuffer_NonErrMsg(temporary,temp2,lstrlen(temp2));
+
+ free(temp2);
+}
+
+
+void RestoreBeforeState(char *dir_path,char *pHeaderBuffer){
+ int i,i2;
+ for(i=0;;i++){
+ if(pHeaderBuffer[i]=='\0') break;
+ if(pHeaderBuffer[i]=='\r'&&pHeaderBuffer[i+1]=='\n') break;
+ }
+ if(pHeaderBuffer[i]=='\0') return;
+ i+=2;
+
+
+ int iDocNum=0;
+ char temporary[MAX_PATH];
+ while(1){
+ //元のファイルパスを取得
+ char szBeforeFilePath[MAX_PATH];
+ for(i2=0;;i++,i2++){
+ if(pHeaderBuffer[i]=='\r'&&pHeaderBuffer[i+1]=='\n'){
+ szBeforeFilePath[i2]=0;
+ break;
+ }
+ szBeforeFilePath[i2]=pHeaderBuffer[i];
+ if(pHeaderBuffer[i]=='\0') break;
+ }
+ if(pHeaderBuffer[i]=='\0') break;
+
+ sprintf(temporary,"%sdocument%02d.txt",dir_path,iDocNum);
+
+ HWND hChild;
+ hChild=NewTextEditWindow(temporary,WNDTYPE_TEXT);
+ int WndNum;
+ WndNum=GetWndNum(hChild);
+
+ char szOldTitle[MAX_PATH];
+ lstrcpy(szOldTitle,MdiInfo[WndNum].title);
+
+ //ドキュメント セレクト コンボボックスから消去
+ extern HWND hDocCombo;
+ i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum].title);
+ SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
+
+ //パスを変更
+ GlobalFree(MdiInfo[WndNum].path);
+ MdiInfo[WndNum].path=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(szBeforeFilePath)+1);
+ lstrcpy(MdiInfo[WndNum].path,szBeforeFilePath);
+
+ //ドキュメント セレクト コンボボックスに挿入
+ char str[MAX_PATH],str2[MAX_PATH];
+ if(szBeforeFilePath[0]){
+ _splitpath(szBeforeFilePath,NULL,NULL,str,str2);
+ lstrcat(str,str2);
+ }
+ else{
+ extern int DocumentCounter;
+ DocumentCounter++;
+ sprintf(str,"Document[%d]",DocumentCounter);
+ }
+ DuplicateTitleCheck(str);
+ GlobalFree(MdiInfo[WndNum].title);
+ MdiInfo[WndNum].title=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(str)+1);
+ lstrcpy(MdiInfo[WndNum].title,str);
+ SendMessage(hDocCombo,CB_ADDSTRING,0,(long)MdiInfo[WndNum].title);
+ i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum].title);
+ SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
+
+ //MDIウィンドウのタイトルを再設定
+ SetWindowText(hChild,MdiInfo[WndNum].title);
+
+ //タブコントロールを再設定
+ COLORREF TabColor;
+ TabColor=pobj_nv->pobj_ExtLink->GetTabColorFromFilePath(MdiInfo[WndNum].path);
+ pobj_MainTab->delete_item(szOldTitle,0);
+ pobj_MainTab->insert(MdiInfo[WndNum].title,0,TabColor);
+
+ MdiInfo[WndNum].pmti->bModify=1;
+
+
+ iDocNum++;
+
+ i+=2;
+ if(pHeaderBuffer[i]=='\0') break;
+ }
+
+ RemoveDirectoryStrong(dir_path);
+}
+
+
+BOOL restore(void){
+ HANDLE hFind;
+ WIN32_FIND_DATA wfd;
+ char temporary[MAX_PATH],*temp2;
+
+ char szTempPath[MAX_PATH];
+ GetTempPath(MAX_PATH,temporary);
+ ShortPathToLongPath(temporary,szTempPath);
+ if(szTempPath[lstrlen(szTempPath)-1]!='\\') lstrcat(szTempPath,"\\");
+
+ sprintf(temporary,"%s*",szTempPath);
+ hFind=FindFirstFile(temporary,&wfd);
+ if(hFind!=INVALID_HANDLE_VALUE){
+ do{
+ if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
+#ifdef THETEXT
+ if(memcmp(wfd.cFileName,"TheText_Temporary_",18)==0){
+#else
+ if(memcmp(wfd.cFileName,"ProjectEditor_Temporary_",24)==0){
+#endif
+ sprintf(temporary,"%s%s\\info.txt",szTempPath,wfd.cFileName);
+ temp2=ReadBuffer_NonErrMsg(temporary);
+ if(temp2){
+ HWND hTemp;
+ sscanf(temp2,"%x",&hTemp);
+ if(!IsWindow(hTemp)){
+ sprintf(temporary,"前回、%sが異常終了した可能性があります。データを復元しますか?",APPLICATION_NAME);
+ if(MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNO)==IDNO){
+ HeapDefaultFree(temp2);
+
+ sprintf(temporary,"%s%s\\",szTempPath,wfd.cFileName);
+ RemoveDirectoryStrong(temporary);
+ return 0;
+ }
+
+ sprintf(temporary,"%s%s\\",szTempPath,wfd.cFileName);
+ RestoreBeforeState(temporary,temp2);
+
+ HeapDefaultFree(temp2);
+
+ return 1;
+ }
+
+ HeapDefaultFree(temp2);
+ }
+ }
+ }
+ }while(FindNextFile(hFind,&wfd));
+ }
+
+ return 0;
+}
Index: /ProjectEditor/CClassInfo.cpp
===================================================================
--- /ProjectEditor/CClassInfo.cpp (revision 3)
+++ /ProjectEditor/CClassInfo.cpp (revision 3)
@@ -0,0 +1,284 @@
+#include "Common.h"
+
+#if defined(JPN)
+//日本語
+#include "pj_msg_jpn.h"
+#else
+//英語
+#include "pj_msg_eng.h"
+#endif
+
+
+CClassInfo::CClassInfo(){
+ pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,1);
+ MemberNum=0;
+}
+CClassInfo::~CClassInfo(){
+ int i;
+ for(i=0;im_hTreeItem==hTreeItem) break;
+ }
+ if(i==iNum) return;
+
+ delete ppobj_FileInfo[i];
+
+ iNum--;
+ for(;im_hTreeItem==hTreeItem) break;
+ }
+ if(i==iNum) return 0;
+ return ppobj_FileInfo[i]->m_path;
+}
+BOOL CDBFileInfo::IsMainFile(HTREEITEM hTreeItem){
+ int i;
+ for(i=0;im_hTreeItem==hTreeItem) break;
+ }
+ if(i==0) return 1;
+ return 0;
+}
+void CDBFileInfo::SetTreeItem(int index,HTREEITEM hTreeItem){
+ ppobj_FileInfo[index]->m_hTreeItem=hTreeItem;
+}
+void CDBFileInfo::ResetTree(void){
+ TV_INSERTSTRUCT tv;
+
+ TreeView_DeleteAllItems(pobj_FileTree->hTree);
+
+ tv.hInsertAfter=TVI_SORT;
+ tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+
+ tv.hParent=TVI_ROOT;
+ tv.item.iImage=0;
+ tv.item.iSelectedImage=0;
+ tv.item.pszText="Source Files";
+ tv.hParent=TreeView_InsertItem(pobj_FileTree->hTree,&tv);
+
+ int i;
+ char temporary[MAX_PATH],temp2[MAX_PATH];
+ for(i=0;im_path,0,0,temporary,temp2);
+ lstrcat(temporary,temp2);
+ tv.item.iImage=2;
+ tv.item.iSelectedImage=2;
+ tv.item.pszText=temporary;
+ ppobj_FileInfo[i]->m_hTreeItem=TreeView_InsertItem(pobj_FileTree->hTree,&tv);
+ }
+}
+BOOL CDBFileInfo::dupli_check(char *path){
+ //重複チェック
+ int i;
+ for(i=0;im_path,path)==0){
+ return 1;
+ }
+ }
+ return 0;
+}
Index: /ProjectEditor/CIEsink.h
===================================================================
--- /ProjectEditor/CIEsink.h (revision 3)
+++ /ProjectEditor/CIEsink.h (revision 3)
@@ -0,0 +1,68 @@
+#include // ATL基本機能用ヘッダファイル
+
+// ATLを使用するために必要なグローバル変数
+// この変数名は、必ず、この名前で無ければなりません。
+extern CComModule _Module;
+
+#include // ATL COM共通用ヘッダファイル
+#include // ATL コンテナ機能サポート用ヘッダファイル
+#include
+
+// 数字は任意。詳しくはIDispatchImplのドキュメント参照
+#define SINKID_COUNTEREVENTS 0
+
+/* CIESink : シンク(イベント受付窓口)クラス */
+class ATL_NO_VTABLE CIESink :
+ public CComObjectRootEx,
+ public IDispEventImpl
+{
+private:
+ CComPtr m_pUnkIE;
+
+public:
+ CIESink() {}
+
+ HRESULT AdviseToIE( CComPtr pUnkIE)
+ {
+ m_pUnkIE = pUnkIE;
+
+ // タイプ ライブラリへのポインタやバージョン情報の設定
+ AtlGetObjectSourceInterface( pUnkIE, &m_libid, &m_iid, &m_wMajorVerNum, &m_wMinorVerNum) ;
+
+ // イベントをDispatch
+ HRESULT hr = this->DispEventAdvise( pUnkIE);
+
+ return hr ;
+ }
+
+BEGIN_COM_MAP(CIESink)
+ COM_INTERFACE_ENTRY_IID(DIID_DWebBrowserEvents2, CIESink)
+END_COM_MAP()
+
+BEGIN_SINK_MAP(CIESink)
+ SINK_ENTRY_EX(SINKID_COUNTEREVENTS, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, &CIESink::OnBeforeNavigate2)
+ SINK_ENTRY_EX(SINKID_COUNTEREVENTS, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW2, &CIESink::OnNewWindow2)
+ SINK_ENTRY_EX(SINKID_COUNTEREVENTS, DIID_DWebBrowserEvents2, DISPID_ONQUIT, &CIESink::OnQuit)
+END_SINK_MAP()
+
+// OnBeforeNavigate2
+void _stdcall OnBeforeNavigate2( IDispatch** ppDisp, VARIANT* pvUrl, VARIANT*, VARIANT* pvTarget, VARIANT*,
+ VARIANT*, VARIANT_BOOL *pbCancel)
+{
+ return ;
+}
+
+// OnNewWindow2
+void _stdcall OnNewWindow2( IDispatch** ppDisp, VARIANT_BOOL *pbCancel)
+{
+ return ;
+}
+
+// OnQuit
+void _stdcall OnQuit()
+{
+ DispEventUnadvise( m_pUnkIE);
+ return ;
+}
+};
+
Index: /ProjectEditor/Caret.cpp
===================================================================
--- /ProjectEditor/Caret.cpp (revision 3)
+++ /ProjectEditor/Caret.cpp (revision 3)
@@ -0,0 +1,855 @@
+#include "common.h"
+
+extern int font_width,font_height;
+
+BOOL IsRightTurn(char *pBuf,int i,int now_x){
+ if(pobj_nv->bRightTurn==0) return 0;
+ if(pobj_nv->iMaxOneLineTextLength-1<=now_x && pBuf[i]!='\r') return 1;
+ return 0;
+}
+
+int GetBufferIndexFromCaretPos(char *pBuf,int now_x,int now_y){
+ int i,i2;
+ int x,y;
+
+ // 行の確認
+ for(i=0,x=0,y=0;;i++,x++){
+ if(y>=now_y) break;
+ if(pBuf[i]=='\0') return 0;
+ if(IsRightTurn(pBuf,i,x)){
+ //右端で折り返す
+ y++;
+ x=-1;
+ i--;
+ continue;
+ }
+ if(pBuf[i]=='\t'){
+ //タブ文字
+ int tab;
+ tab=pobj_nv->TabSize;
+
+ if(x%tab==0) i2=tab;
+ else i2=tab-x%tab;
+ x+=i2-1;
+ continue;
+ }
+ else if(IsDBCSLeadByte(pBuf[i])){
+ //マルチバイト文字
+ x++;
+ i++;
+ continue;
+ }
+
+ if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+ y++;
+ i++;
+ x=-1;
+ }
+ }
+
+ //列の確認
+ for(x=0;xTabSize;
+
+ if(x%tab==0) i2=tab;
+ else i2=tab-x%tab;
+ x+=i2-1;
+ continue;
+ }
+ else if(IsDBCSLeadByte(pBuf[i])){
+ //マルチバイト文字
+ x++;
+ i++;
+ continue;
+ }
+ }
+
+ return i;
+}
+void GetCaretPosFromBufferIndex(char *pBuf,int index,POINT *pCaretPos){
+ int i,i2;
+
+ pCaretPos->x=0;
+ pCaretPos->y=0;
+ for(i=0;ix++){
+ if(pBuf[i]=='\0') break;
+ if(IsRightTurn(pBuf,i,pCaretPos->x)){
+ //右端で折り返す
+ pCaretPos->y++;
+ pCaretPos->x=-1;
+ i--;
+ continue;
+ }
+ if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+ pCaretPos->x=-1;
+ pCaretPos->y++;
+ i++;
+ continue;
+ }
+ if(IsDBCSLeadByte(pBuf[i])){
+ i++;
+ pCaretPos->x++;
+ continue;
+ }
+ if(pBuf[i]=='\t'){
+ //タブ文字
+ int tab;
+ tab=pobj_nv->TabSize;
+
+ if(pCaretPos->x%tab==0) i2=tab;
+ else i2=tab-pCaretPos->x%tab;
+ pCaretPos->x+=i2-1;
+ continue;
+ }
+ else if(IsDBCSLeadByte(pBuf[i])){
+ //マルチバイト文字
+ pCaretPos->x++;
+ i++;
+ continue;
+ }
+ }
+}
+
+void TextEdit_GetSel(int WndNum,CHARRANGE *pCharRange){
+ //////////////////////////////////////////
+ // 選択範囲(バッファインデックス)を取得
+ //////////////////////////////////////////
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+
+ pCharRange->cpMin=GetBufferIndexFromCaretPos(
+ MdiInfo[WndNum].pmti->buffer,
+ MdiInfo[WndNum].pmti->StartCaretPos.x,
+ MdiInfo[WndNum].pmti->StartCaretPos.y);
+
+ if(MdiInfo[WndNum].pmti->StartCaretPos.x==MdiInfo[WndNum].pmti->EndCaretPos.x&&
+ MdiInfo[WndNum].pmti->StartCaretPos.y==MdiInfo[WndNum].pmti->EndCaretPos.y){
+ //選択されていないとき
+ pCharRange->cpMax=pCharRange->cpMin;
+ }
+ else{
+ pCharRange->cpMax=GetBufferIndexFromCaretPos(
+ MdiInfo[WndNum].pmti->buffer,
+ MdiInfo[WndNum].pmti->EndCaretPos.x,
+ MdiInfo[WndNum].pmti->EndCaretPos.y);
+ }
+
+ if(pCharRange->cpMin>pCharRange->cpMax){
+ long temp;
+ temp=pCharRange->cpMin;
+ pCharRange->cpMin=pCharRange->cpMax;
+ pCharRange->cpMax=temp;
+ }
+}
+void TextEdit_GetSelText(int WndNum,CHARRANGE *pCharRange,char *buffer){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+
+ memcpy(buffer,
+ MdiInfo[WndNum].pmti->buffer+pCharRange->cpMin,
+ pCharRange->cpMax-pCharRange->cpMin);
+ buffer[pCharRange->cpMax-pCharRange->cpMin]=0;
+}
+
+void GetScrollBaseCaretPos(int WndNum,int *pNaturalBaseX,int *pNaturalBaseY){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+
+ HWND hEdit;
+ hEdit=MdiInfo[WndNum].pmti->hEdit;
+
+ //垂直スクロールバーの位置
+ SCROLLINFO si;
+ si.cbSize=sizeof(SCROLLINFO);
+ si.fMask=SIF_POS;
+ GetScrollInfo(hEdit,SB_VERT,&si);
+ *pNaturalBaseY-=si.nPos; //文字単位
+
+ //水平スクロールバーの位置
+ GetScrollInfo(hEdit,SB_HORZ,&si);
+ *pNaturalBaseX-=si.nPos; //文字単位
+}
+
+void GetNaturalBaseCaretPos(int WndNum,int *pScrollBaseX,int *pScrollBaseY){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+
+ HWND hEdit;
+ hEdit=GetWindow(MdiInfo[WndNum].hwnd,GW_CHILD);
+
+ //垂直スクロールバーの位置
+ SCROLLINFO si;
+ si.cbSize=sizeof(SCROLLINFO);
+ si.fMask=SIF_POS;
+ GetScrollInfo(hEdit,SB_VERT,&si);
+ *pScrollBaseY+=si.nPos; //文字単位
+
+ //水平スクロールバーの位置
+ GetScrollInfo(hEdit,SB_HORZ,&si);
+ *pScrollBaseX+=si.nPos; //文字単位
+}
+
+void TextEdit_SetSel(int WndNum,int StartIndex,int EndIndex,BOOL bShowCenter){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+
+ GetCaretPosFromBufferIndex(
+ MdiInfo[WndNum].pmti->buffer,
+ StartIndex,
+ &MdiInfo[WndNum].pmti->StartCaretPos);
+
+ GetCaretPosFromBufferIndex(
+ MdiInfo[WndNum].pmti->buffer,
+ EndIndex,
+ &MdiInfo[WndNum].pmti->EndCaretPos);
+
+ HWND hEdit;
+ hEdit=GetWindow(MdiInfo[WndNum].hwnd,GW_CHILD);
+
+ if(!TextEdit_ScrollCaret(WndNum,0,bShowCenter))
+ InvalidateRect(hEdit,NULL,0);
+ ResetCaretPos(WndNum);
+
+ ResetState_EditMenu();
+}
+void TextEdit_SelectOneLine(int WndNum,int code_pos,BOOL bShowCenter){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+
+ ///////////////////////
+ // 定義行の選択範囲
+ ///////////////////////
+
+ int iStartPos;
+ iStartPos=code_pos;
+ while(MdiInfo[WndNum].pmti->buffer[iStartPos]!='\n'&&iStartPos>0) iStartPos--;
+ if(MdiInfo[WndNum].pmti->buffer[iStartPos]=='\n') iStartPos++;
+
+ int iEndPos;
+ iEndPos=code_pos;
+ while(MdiInfo[WndNum].pmti->buffer[iEndPos]!='\r'&&MdiInfo[WndNum].pmti->buffer[iEndPos]!='\0') iEndPos++;
+
+ TextEdit_SetSel(WndNum,iStartPos,iEndPos,bShowCenter);
+}
+void ResetCaretPos(int WndNum,BOOL bInputAndReset){
+ extern HANDLE hHeap;
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ int x,y;
+
+ POINT OldPos;
+ GetCaretPos(&OldPos);
+
+ x=MdiInfo[WndNum].pmti->StartCaretPos.x;
+ y=MdiInfo[WndNum].pmti->StartCaretPos.y;
+ GetScrollBaseCaretPos(WndNum,&x,&y);
+
+ //エディタ画面左端のコントロールタブ
+ int iControlTabSpace;
+ iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+
+ //コントロールタブ上にカーソルがきたときに、非表示にする
+ if(OldPos.x>=iControlTabSpace&&x<0) HideCaret(MdiInfo[WndNum].pmti->hEdit);
+ else if(OldPos.x=0) ShowCaret(MdiInfo[WndNum].pmti->hEdit);
+
+ SetCaretPos(
+ x*font_width +iControlTabSpace,
+ y*font_height);
+
+ SetStatusText(NULL);
+
+
+ //////////////////////////////////////////////
+ // Web検索文字列
+ //////////////////////////////////////////////
+ if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
+ int start,end;
+ if(MdiInfo[WndNum].pmti->StartCaretPos.x==MdiInfo[WndNum].pmti->EndCaretPos.x&&
+ MdiInfo[WndNum].pmti->StartCaretPos.y==MdiInfo[WndNum].pmti->EndCaretPos.y){
+ //文字列を選択中でないとき
+
+ int sw=0;
+ if(bInputAndReset){
+ if(MdiInfo[WndNum].pmti->StartCaretPos.x>1){
+ MdiInfo[WndNum].pmti->StartCaretPos.x-=2;
+ sw=1;
+ }
+ }
+
+ TextEdit_GetWordCaret(
+ MdiInfo[WndNum].pmti->hEdit,
+ WndNum,
+ &MdiInfo[WndNum].pmti->StartCaretPos,
+ &start,&end,
+ WORDCARET_BEFORE);
+
+ if(sw) MdiInfo[WndNum].pmti->StartCaretPos.x+=2;
+
+ //半角文字列を選択時の全角とのズレを修正
+ POINT pos;
+ GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,start,&pos);
+ start=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pmti->buffer,pos.x,pos.y);
+ GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,end,&pos);
+ end=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pmti->buffer,pos.x,pos.y);
+ }
+ else{
+ //文字列を選択中のとき
+ start=GetBufferIndexFromCaretPos(
+ MdiInfo[WndNum].pmti->buffer,
+ MdiInfo[WndNum].pmti->StartCaretPos.x,
+ MdiInfo[WndNum].pmti->StartCaretPos.y);
+ end=GetBufferIndexFromCaretPos(
+ MdiInfo[WndNum].pmti->buffer,
+ MdiInfo[WndNum].pmti->EndCaretPos.x,
+ MdiInfo[WndNum].pmti->EndCaretPos.y);
+ }
+
+ if(start>end){
+ int iTemp;
+ iTemp=start;
+ start=end;
+ end=iTemp;
+ }
+
+ char *pTemp;
+ int length;
+ length=end-start;
+ if(length<0) length=0;
+ pTemp=(char *)HeapAlloc(hHeap,0,length+1024);
+ memcpy(pTemp,MdiInfo[WndNum].pmti->buffer+start,length);
+ pTemp[length]=0;
+
+ char *temp2;
+ temp2=strstr(pTemp,"\r\n");
+ if(temp2) temp2[0]=0;
+
+ extern HWND hWebSearchCombo;
+ SetWindowText(GetWindow(hWebSearchCombo,GW_CHILD),pTemp);
+
+ //未完成
+ HeapDefaultFree(pTemp);
+ /*if((!IsHiragana(pTemp))&&pTemp[0]&&pTemp[1]){
+ //バックグラウンドでWeb検索をかける
+ _beginthread(WebSearchThread,0,(void *)pTemp);
+
+ //※pTempはWebSearchThreadスレッド内で破棄する
+ }
+ else{
+ HeapDefaultFree(pTemp);
+ }*/
+ }
+
+
+ ////////////////////////////////////////////////////
+ // パラメータヒントを更新
+ ////////////////////////////////////////////////////
+
+ extern METHODCHECKINFO MethodCheckInfo;
+ if(MethodCheckInfo.hWnd){
+ if(MdiInfo[WndNum].DocType==WNDTYPE_BASIC)
+ ShowParameterHint(WndNum);
+ }
+
+
+ //////////////////////////////////
+ // コード補完機能を利用中の場合
+ //////////////////////////////////
+
+ extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+ if(ComplementWndInfo.hWnd){
+ int i,i2;
+ char *pTemp,temporary[VN_SIZE];
+
+ i=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pmti->buffer,
+ MdiInfo[WndNum].pmti->StartCaretPos.x,
+ MdiInfo[WndNum].pmti->StartCaretPos.y);
+
+ if(ibuffer+ComplementWndInfo.iPos,
+ ComplementWndInfo.iLength);
+ pTemp[ComplementWndInfo.iLength]=0;
+
+ for(i=0;iが消されたとき)
+ // 補完ウィンドウを破棄する
+ DestroyWindow(ComplementWndInfo.hWnd);
+ ComplementWndInfo.hWnd=0;
+ return;
+ }
+
+ pTemp=(char *)HeapAlloc(hHeap,0,ComplementWndInfo.iLength+1);
+ memcpy(pTemp,
+ MdiInfo[WndNum].pmti->buffer+ComplementWndInfo.iPos,
+ ComplementWndInfo.iLength);
+ pTemp[ComplementWndInfo.iLength]=0;
+
+ for(i=0;ihEdit;
+
+ x=MdiInfo[WndNum].pmti->StartCaretPos.x;
+ y=MdiInfo[WndNum].pmti->StartCaretPos.y;
+ GetScrollBaseCaretPos(WndNum,&x,&y);
+
+ //垂直方向
+ SCROLLINFO si;
+ si.cbSize=sizeof(SCROLLINFO);
+ si.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
+ GetScrollInfo(hEdit,SB_VERT,&si);
+ if(bShowCenter==0){
+ //通常キャレットスクロール
+ if(y<0){
+ //上へスクロール
+
+ si.nPos+=y;
+ SetScrollInfo(hEdit,SB_VERT,&si,1);
+ InvalidateRect(hEdit,NULL,0);
+ bScroll=1;
+ }
+ if(si.nPage&&y>(int)si.nPage-1){
+ //下へスクロール
+
+ si.nPos+=y-si.nPage;
+
+ SetScrollInfo(hEdit,SB_VERT,&si,1);
+ InvalidateRect(hEdit,NULL,0);
+ bScroll=1;
+ }
+ }
+ else{
+ //上部にキャレットがくるようにスクロール
+
+ if(y<0||
+ si.nPage&&y>(int)si.nPage-1){
+
+ si.nPos+=y-si.nPage/3;
+ SetScrollInfo(hEdit,SB_VERT,&si,1);
+ InvalidateRect(hEdit,NULL,0);
+ bScroll=1;
+ }
+ }
+
+
+ //水平方向
+ GetScrollInfo(hEdit,SB_HORZ,&si);
+ if(x<0){
+ si.nPos+=x-1;
+ if(!bScrollOneStep_x) si.nPos-=si.nPage/4;
+ if(si.nPos<0) si.nPos=0;
+ SetScrollInfo(hEdit,SB_HORZ,&si,1);
+ InvalidateRect(hEdit,NULL,0);
+ bScroll=1;
+ }
+ if(si.nPage&&x>(int)si.nPage){
+ si.nPos+=x-si.nPage;
+ if(!bScrollOneStep_x) si.nPos+=si.nPage/3;
+ SetScrollInfo(hEdit,SB_HORZ,&si,1);
+ InvalidateRect(hEdit,NULL,0);
+ bScroll=1;
+ }
+
+ return bScroll;
+}
+
+void CaretPos_LooseToNatural(int WndNum,int loose_x,int loose_y,POINT *pCaretPos){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ int i,i2,LastPos;
+ int x,y;
+ char *pBuf;
+
+ //負数の場合は0をセット
+ if(loose_x<0) loose_x=0;
+ if(loose_y<0) loose_y=0;
+
+ pBuf=MdiInfo[WndNum].pmti->buffer;
+
+ // 行の確認
+ LastPos=0;
+ for(i=0,x=0,y=0;;i++,x++){
+ if(y>=loose_y){
+ pCaretPos->y=y;
+ break;
+ }
+ if(pBuf[i]=='\0'){
+ pCaretPos->y=y;
+ i=LastPos;
+ break;
+ }
+
+ if(IsRightTurn(pBuf,i,x)){
+ LastPos=i;
+
+ //右端で折り返す
+ y++;
+ x=-1;
+ i--;
+ continue;
+ }
+ if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+ LastPos=i+2;
+ y++;
+ i++;
+ x=-1;
+ }
+
+ if(pBuf[i]=='\t'){
+ //タブ文字
+ int tab;
+ tab=pobj_nv->TabSize;
+
+ if(x%tab==0) i2=tab;
+ else i2=tab-x%tab;
+ x+=i2-1;
+ continue;
+ }
+ else if(IsDBCSLeadByte(pBuf[i])){
+ //マルチバイト文字
+ x++;
+ i++;
+ continue;
+ }
+ }
+
+ //列の確認
+ x=0;
+ for(;;i++,x++){
+ if(IsRightTurn(pBuf,i,x)){
+ //折り返しよりも右側が指定場所のとき
+ pCaretPos->x=x;
+ break;
+ }
+
+ if(pBuf[i]=='\t'){
+ //タブ文字
+ int tab;
+ tab=pobj_nv->TabSize;
+
+ if(x%tab==0) i2=tab;
+ else i2=tab-x%tab;
+ if(x+i2-1>=loose_x){
+ //指定場所にキャレットが存在するとき(タブ内)
+ pCaretPos->x=x;
+ break;
+ }
+ x+=i2-1;
+ continue;
+ }
+ else if(IsDBCSLeadByte(pBuf[i])){
+ //マルチバイト文字
+ x++;
+ i++;
+ if(x>=loose_x){
+ //マルチバイト文字の間にキャレットが存在するとき
+ pCaretPos->x=x-1;
+ break;
+ }
+ continue;
+ }
+
+ if(x>=loose_x){
+ //指定場所にキャレットが存在するとき(通常)
+ pCaretPos->x=x;
+ break;
+ }
+
+ if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'||pBuf[i]=='\0'){
+ //改行文字よりも右側が指定場所のとき
+ pCaretPos->x=x;
+ break;
+ }
+ }
+}
+
+void GetNaturalCaretPos_Click(int WndNum,int mouse_x,int mouse_y,POINT *pCaretPos){
+ /////////////////////////////
+ // キャレット移動(クリック)
+ /////////////////////////////
+
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+
+ //ピクセル座標をカーソル座標(文字単位)に変更
+ mouse_x=(int)((double)mouse_x/(double)font_width+0.5);
+ mouse_y/=font_height;
+ GetNaturalBaseCaretPos(WndNum,&mouse_x,&mouse_y);
+
+ CaretPos_LooseToNatural(WndNum,mouse_x,mouse_y,pCaretPos);
+}
+void GetNaturalCaretPos_Left(int WndNum){
+ ///////////////////////////
+ // キャレット移動(左キー)
+ ///////////////////////////
+
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ int i;
+ int x,y;
+ char *pBuf;
+
+ POINT *pCaretPos;
+ pCaretPos=&MdiInfo[WndNum].pmti->StartCaretPos;
+
+ if(pCaretPos->x==0&&pCaretPos->y==0){
+ //ファイルの先頭から左へは行けない
+ return;
+ }
+
+ pBuf=MdiInfo[WndNum].pmti->buffer;
+
+ i=GetBufferIndexFromCaretPos(pBuf,
+ pCaretPos->x,
+ pCaretPos->y);
+
+ if(i>=2){
+ if(pBuf[i-2]=='\r'&&pBuf[i-1]=='\n'){
+ //列先頭から前行の終端へ
+ x=INT_MAX;
+ y=pCaretPos->y-1;
+ CaretPos_LooseToNatural(WndNum,
+ x,y,
+ pCaretPos);
+ return;
+ }
+ }
+
+ x=pCaretPos->x-1;
+ y=pCaretPos->y;
+
+ BOOL sw=0;
+ if(x<0){
+ x=INT_MAX;
+ y--;
+
+ sw=1;
+ }
+
+ CaretPos_LooseToNatural(WndNum,
+ x,y,
+ pCaretPos);
+
+ if(sw){
+ GetNaturalCaretPos_Left(WndNum);
+ }
+}
+void GetNaturalCaretPos_Right(int WndNum,POINT *pCaretPos){
+ ///////////////////////////
+ // キャレット移動(右キー)
+ ///////////////////////////
+
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ int i,i2;
+ char *pBuf;
+
+ pBuf=MdiInfo[WndNum].pmti->buffer;
+
+ i=GetBufferIndexFromCaretPos(pBuf,
+ pCaretPos->x,
+ pCaretPos->y);
+
+ if(pBuf[i]=='\0'){
+ //ファイルの終端から右へは行けない
+ return;
+ }
+ else if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+ //改行コードから右へ
+ pCaretPos->x=0;
+ pCaretPos->y++;
+ }
+ else if(pBuf[i]=='\t'){
+ //タブ文字から右へ
+ int tab;
+ tab=pobj_nv->TabSize;
+
+ if(pCaretPos->x%tab==0) i2=tab;
+ else i2=tab-pCaretPos->x%tab;
+ pCaretPos->x+=i2;
+ }
+ else if(IsDBCSLeadByte(pBuf[i])){
+ //マルチバイト文字
+ pCaretPos->x+=2;
+ }
+ else{
+ //右へ(通常)
+ pCaretPos->x++;
+ }
+
+ //折り返し
+ int iMax_OneLine_TextLength;
+ iMax_OneLine_TextLength=40;
+ if(IsRightTurn(pBuf,i,pCaretPos->x)){
+ pCaretPos->x=0;
+ pCaretPos->y++;
+ }
+
+ CaretPos_LooseToNatural(WndNum,
+ pCaretPos->x,
+ pCaretPos->y,
+ pCaretPos);
+}
+void GetNaturalCaretPos_Up(int WndNum,POINT *pCaretPos){
+ ///////////////////////////
+ // キャレット移動(上キー)
+ ///////////////////////////
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+
+ if(pCaretPos->y==0){
+ //1行目にキャレットがあるとき
+ return;
+ }
+
+ //上下のキャレット移動時には、左右方向の位置を保持する
+ if(MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos==-1)
+ MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=pCaretPos->x;
+
+ pCaretPos->y--;
+
+ CaretPos_LooseToNatural(WndNum,
+ MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos,
+ pCaretPos->y,
+ pCaretPos);
+}
+void GetNaturalCaretPos_Down(int WndNum,POINT *pCaretPos){
+ ///////////////////////////
+ // キャレット移動(下キー)
+ ///////////////////////////
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+
+ //上下のキャレット移動時には、左右方向の位置を保持する
+ if(MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos==-1)
+ MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=pCaretPos->x;
+
+ pCaretPos->y++;
+
+ CaretPos_LooseToNatural(WndNum,
+ MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos,
+ pCaretPos->y,
+ pCaretPos);
+}
+void GetNaturalCaretPos_PageUp(int WndNum,POINT *pCaretPos){
+ ///////////////////////////////
+ // キャレット移動(PageUpキー)
+ ///////////////////////////////
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+
+ if(pCaretPos->y==0){
+ //1行目にキャレットがあるとき
+ return;
+ }
+
+ //上下のキャレット移動時には、左右方向の位置を保持する
+ if(MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos==-1)
+ MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=pCaretPos->x;
+
+ SCROLLINFO si;
+ si.cbSize=sizeof(SCROLLINFO);
+ si.fMask=SIF_PAGE;
+ GetScrollInfo(MdiInfo[WndNum].pmti->hEdit,SB_VERT,&si);
+ pCaretPos->y-=si.nPage;
+ if(pCaretPos->y<0) pCaretPos->y=0;
+
+ CaretPos_LooseToNatural(WndNum,
+ MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos,
+ pCaretPos->y,
+ pCaretPos);
+}
+void GetNaturalCaretPos_PageDown(int WndNum,POINT *pCaretPos){
+ ///////////////////////////////
+ // キャレット移動(PageUpキー)
+ ///////////////////////////////
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+
+ //上下のキャレット移動時には、左右方向の位置を保持する
+ if(MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos==-1)
+ MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=pCaretPos->x;
+
+ SCROLLINFO si;
+ si.cbSize=sizeof(SCROLLINFO);
+ si.fMask=SIF_PAGE;
+ GetScrollInfo(MdiInfo[WndNum].pmti->hEdit,SB_VERT,&si);
+ pCaretPos->y+=si.nPage;
+
+ CaretPos_LooseToNatural(WndNum,
+ MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos,
+ pCaretPos->y,
+ pCaretPos);
+}
Index: /ProjectEditor/ChildWndOnRebar.cpp
===================================================================
--- /ProjectEditor/ChildWndOnRebar.cpp (revision 3)
+++ /ProjectEditor/ChildWndOnRebar.cpp (revision 3)
@@ -0,0 +1,420 @@
+#include "Common.h"
+
+
+
+//ファイル選択コンボボックス
+HWND hDocCombo;
+
+//スタンダードツールバー
+HWND hStandardToolbarPager; //ページャー
+ILuxToolbar *pobj_StandardToolbar;
+
+//デバッガツールバー
+HWND hDebuggerToolbarPager; //ページャー
+ILuxToolbar *pobj_DebuggerToolbar;
+
+//ビルドツールバー
+HWND hReleaseToolbarPager;
+ILuxToolbar *pobj_ReleaseToolbar;
+
+//プラットフォーム選択コンボボックス
+HWND hSelectCompilerCombo;
+
+//WebSearchコンボボックス
+HWND hWebSearchCombo;
+
+
+
+
+/////////////////
+// レバー追加
+// ※Add~プロシージャを追加
+/////////////////
+
+
+/* 以下は各バンドのメッセージプロシージャ */
+
+//hDocCombo(Rebar)プロシージャ
+LRESULT CALLBACK DocComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern WNDPROC OldDocComboProc;
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ int i;
+ char str[MAX_PATH];
+ RECT rect;
+ switch(message){
+ case WM_COMMAND:
+ if(HIWORD(wParam)==CBN_SELCHANGE){
+ SendMessage(hwnd,CB_GETLBTEXT,SendMessage(hwnd,CB_GETCURSEL,0,0),(long)str);
+ for(i=0;imenu_popup(hwnd,LOWORD(lParam),HIWORD(lParam));
+ break;
+ }
+ return CallWindowProc(OldDocComboProc,hwnd,message,wParam,lParam);
+}
+
+//hStandardToolbar(Rebar)プロシージャ
+LRESULT CALLBACK StandardToolbarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern char CmdMsg[255];
+ extern WNDPROC OldStandardToolbarProc;
+ if(message==WM_RBUTTONUP){
+ pobj_Rebar->menu_popup(hwnd,LOWORD(lParam),HIWORD(lParam));
+ InvalidateRect(hwnd,NULL,0);
+ }
+ return CallWindowProc(OldStandardToolbarProc,hwnd,message,wParam,lParam);
+}
+
+//hSelectCompilerCombo(Rebar)プロシージャ
+LRESULT CALLBACK SelectCompilerComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern WNDPROC OldSelectCompilerComboProc;
+ int i;
+ switch(message){
+ case WM_COMMAND:
+ if(HIWORD(wParam)==CBN_SELCHANGE){
+ i=SendMessage(hwnd,CB_GETCURSEL,0,0);
+
+ extern char *lpszCompilerName;
+ if(i==0) lpszCompilerName=WIN32_COMPILER_NAME;
+ if(i==1) lpszCompilerName=WIN64_COMPILER_NAME;
+ }
+ break;
+ case WM_LBUTTONDOWN:
+ RECT rect;
+ GetClientRect(hwnd,&rect);
+ SetWindowPos(hwnd,NULL,0,0,rect.right,120,SWP_NOMOVE);
+ break;
+ case WM_RBUTTONUP:
+ pobj_Rebar->menu_popup(hwnd,LOWORD(lParam),HIWORD(lParam));
+ break;
+ }
+ return CallWindowProc(OldSelectCompilerComboProc,hwnd,message,wParam,lParam);
+}
+
+//hWebSearchCombo(Rebar)プロシージャ
+LRESULT CALLBACK WebSearchProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern WNDPROC OldWebSearchProc;
+ switch(message){
+ case WM_LBUTTONDOWN:
+ RECT rect;
+ GetClientRect(hwnd,&rect);
+ SetWindowPos(hwnd,NULL,0,0,rect.right,120,SWP_NOMOVE);
+ break;
+ }
+ return CallWindowProc(OldWebSearchProc,hwnd,message,wParam,lParam);
+}
+
+LRESULT CALLBACK WebSearchEditProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern WNDPROC OldWebSearchEditProc;
+ switch(message){
+ case WM_CHAR:
+ if(LOWORD(wParam)==VK_RETURN){
+ char *buffer,*temporary;
+ buffer=(char *)HeapAlloc(hHeap,0,MAX_PATH*3+1024);
+ temporary=(char *)HeapAlloc(hHeap,0,MAX_PATH*3+1024);
+
+ GetWindowText(hwnd,temporary,MAX_PATH);
+
+ int i=0;
+ while(temporary[i]==' ') i++;
+
+ char temp2[MAX_PATH];
+ strncpy(temp2,temporary+i,MAX_PATH);
+
+ i=lstrlen(temp2);
+ while(i>0){
+ if(temp2[i-1]==' ') i--;
+ else break;
+ }
+ temp2[i]=0;
+
+ //EUCに変換
+ nkf.pSetNkfOption("-wx");
+ nkf.pNkfConvert(buffer,temp2);
+
+ //URLエンコード
+ URLEncode(buffer);
+
+
+ if(bProfessional){
+ //Pro版は埋め込み型で表示
+ lstrcpy(temporary,"http://www.activebasic.com/application_search.php?query=");
+ lstrcat(temporary,buffer);
+ lstrcat(temporary,"&type=web&utf_sw=1");
+
+ pobj_SideWeb->GoPage(temporary);
+ }
+ else{
+ //Standard版は外部リンクとして表示
+ lstrcpy(temporary,"http://www.activebasic.com/search.php?query=");
+ lstrcat(temporary,buffer);
+ lstrcat(temporary,"&type=web&utf_sw=1");
+
+ ShellExecute(hwnd,"open","iexplore.exe",temporary,NULL,SW_SHOWNORMAL);
+ }
+
+
+ AddFindData(GetParent(hwnd),pobj_nv->WebStr,temp2);
+
+ HeapDefaultFree(buffer);
+ HeapDefaultFree(temporary);
+ }
+ break;
+ }
+ return CallWindowProc(OldWebSearchEditProc,hwnd,message,wParam,lParam);
+}
+
+
+
+/*----- 以下はRebarの初期生成 -----*/
+
+//ドキュメント選択コンボボックスをレバーに追加
+HWND AddDocCombo(HWND hRebar,int num,char *lpszText){
+ extern HINSTANCE hInst;
+ extern HWND hDocCombo,hClient;
+ extern WNDPROC OldDocComboProc;
+ extern HFONT hStatusFont;
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ int i,i2;
+ HWND hTempWnd;
+ char buffer[MAX_PATH];
+
+ //コンボボックスを生成
+ hDocCombo=CreateWindow("COMBOBOX",NULL,
+ WS_CHILD|WS_VSCROLL|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_DROPDOWN|CBS_HASSTRINGS|CBS_SORT,
+ 0,0,0,120,hRebar,NULL,hInst,NULL);
+
+ //サブクラス化
+ OldDocComboProc=(WNDPROC)GetWindowLong(hDocCombo,GWL_WNDPROC);
+ SetWindowLong(hDocCombo,GWL_WNDPROC,(long)DocComboProc);
+
+ //フォントを設定
+ SendMessage(hDocCombo,WM_SETFONT,(unsigned int)hStatusFont,0);
+
+ hTempWnd=GetWindow(hClient,GW_CHILD);
+ if(IsWindow(hTempWnd)){
+ for(i=0,i2=0;iRelease();
+ pobj_StandardToolbar=LuxToolbar_CreateInstance();
+ pobj_StandardToolbar->Create(hStandardToolbarPager);
+
+
+#define ADD_TOOLBAR_BUTTON(id,iconID,lpszToolTip) pobj_StandardToolbar->Add(id,(HICON)LoadImage(hIconResInst,MAKEINTRESOURCE(iconID),IMAGE_ICON,16,16,0),lpszToolTip)
+#define ADD_TOOLBAR_SEPARATOR pobj_StandardToolbar->Add(0,0,0)
+ //ボタン類を追加
+ ADD_TOOLBAR_BUTTON(IDM_NEW,IDI_NEW,"新規作成(Ctrl+N)");
+ ADD_TOOLBAR_SEPARATOR;
+ ADD_TOOLBAR_BUTTON(IDM_OPEN,IDI_OPEN,"開く(Ctrl+O)");
+ ADD_TOOLBAR_BUTTON(IDM_SAVE,IDI_SAVE,"保存(Ctrl+S)");
+ ADD_TOOLBAR_BUTTON(IDM_ALLSAVE,IDI_ALLSAVE,"すべて保存");
+ ADD_TOOLBAR_SEPARATOR;
+ ADD_TOOLBAR_BUTTON(IDM_CUT,IDI_CUT,"切り取り(Ctrl+X)");
+ ADD_TOOLBAR_BUTTON(IDM_COPY,IDI_COPY,"コピー(Ctrl+C)");
+ ADD_TOOLBAR_BUTTON(IDM_PASTE,IDI_PASTE,"貼り付け(Ctrl+V)");
+ ADD_TOOLBAR_SEPARATOR;
+ ADD_TOOLBAR_BUTTON(IDM_UNDO,IDI_UNDO,"元に戻す(Ctrl+Z)");
+ ADD_TOOLBAR_BUTTON(IDM_REDO,IDI_REDO,"やり直し(Ctrl+Y)");
+ ADD_TOOLBAR_SEPARATOR;
+ ADD_TOOLBAR_BUTTON(IDM_FIND,IDI_FIND,"検索(Ctrl+F)");
+#undef ADD_TOOLBAR_SEPARATOR
+#undef ADD_TOOLBAR_BUTTON
+
+
+ //ページャー設定
+ Pager_SetChild(hStandardToolbarPager,pobj_StandardToolbar->GetHandle());
+
+
+ //サブクラス化
+ extern WNDPROC OldStandardToolbarProc;
+ OldStandardToolbarProc=(WNDPROC)GetWindowLong(pobj_StandardToolbar->GetHandle(),GWL_WNDPROC);
+ SetWindowLong(pobj_StandardToolbar->GetHandle(),GWL_WNDPROC,(long)StandardToolbarProc);
+
+ lpszText[0]=0;
+ return hStandardToolbarPager;
+}
+
+//デバッガツールバーをレバーに追加
+HWND AddDebuggerToolbar(HWND hRebar,int num,char *lpszText){
+#ifndef THETEXT
+
+ extern HWND hDebuggerToolbarPager;
+
+ hDebuggerToolbarPager=CreateWindow(WC_PAGESCROLLER,NULL,
+ WS_CHILD|WS_VISIBLE|PGS_HORZ,
+ 0,0,0,0,
+ hRebar,NULL,hInst,NULL);
+
+ //LuxToolbarオブジェクトを生成
+ if(pobj_DebuggerToolbar) pobj_DebuggerToolbar->Release();
+ pobj_DebuggerToolbar=LuxToolbar_CreateInstance();
+ pobj_DebuggerToolbar->Create(hDebuggerToolbarPager);
+
+#define ADD_TOOLBAR_BUTTON(id,iconID,lpszToolTip) pobj_DebuggerToolbar->Add(id,(HICON)LoadImage(hIconResInst,MAKEINTRESOURCE(iconID),IMAGE_ICON,16,16,0),lpszToolTip)
+#define ADD_TOOLBAR_SEPARATOR pobj_DebuggerToolbar->Add(0,0,0)
+ //ボタン類を追加
+ ADD_TOOLBAR_BUTTON(IDM_DEBUGCOMPILE,IDI_DEBUGCOMPILE,"デバッグ コンパイル");
+ ADD_TOOLBAR_SEPARATOR;
+ ADD_TOOLBAR_BUTTON(IDM_DEBUG,IDI_DEBUGRUN,"デバッグ実行(F8)");
+ ADD_TOOLBAR_BUTTON(IDM_DEBUG_PAUSE,IDI_DEBUGPAUSE,"デバッグを一時停止");
+ ADD_TOOLBAR_BUTTON(IDM_DEBUG_STOP,IDI_DEBUGSTOP,"デバッグを中断");
+ ADD_TOOLBAR_SEPARATOR;
+ ADD_TOOLBAR_BUTTON(IDM_STEP_IN,IDI_STEPIN,"ステップ イン(F10)");
+ ADD_TOOLBAR_BUTTON(IDM_STEP_OVER,IDI_STEPOVER,"ステップ オーバー(F11)");
+ ADD_TOOLBAR_BUTTON(IDM_STEP_CURSOR,IDI_STEPTOCURSOR,"カーソル行まで実行(Ctrl+F11)");
+ ADD_TOOLBAR_SEPARATOR;
+ ADD_TOOLBAR_BUTTON(IDM_BREAKPOINT,IDI_BREAKPOINT,"ブレークポイントの設置/解除(F9)");
+#undef ADD_TOOLBAR_SEPARATOR
+#undef ADD_TOOLBAR_BUTTON
+
+ //ページャー設定
+ Pager_SetChild(hDebuggerToolbarPager,pobj_DebuggerToolbar->GetHandle());
+
+ //サブクラス化
+ extern WNDPROC OldStandardToolbarProc;
+ OldStandardToolbarProc=(WNDPROC)GetWindowLong(pobj_DebuggerToolbar->GetHandle(),GWL_WNDPROC);
+ SetWindowLong(pobj_DebuggerToolbar->GetHandle(),GWL_WNDPROC,(long)StandardToolbarProc);
+
+ lpszText[0]=0;
+ return hDebuggerToolbarPager;
+#else //THETEXT
+ return 0;
+#endif //THETEXT
+}
+
+//リリースツールバーをレバーに追加
+HWND AddReleaseToolbar(HWND hRebar,int num,char *lpszText){
+#ifndef THETEXT
+
+ extern HWND hReleaseToolbarPager;
+
+ hReleaseToolbarPager=CreateWindow(WC_PAGESCROLLER,NULL,
+ WS_CHILD|WS_VISIBLE|PGS_HORZ,
+ 0,0,0,0,
+ hRebar,NULL,hInst,NULL);
+
+ //LuxToolbarオブジェクトを生成
+ if(pobj_ReleaseToolbar) pobj_ReleaseToolbar->Release();
+ pobj_ReleaseToolbar=LuxToolbar_CreateInstance();
+ pobj_ReleaseToolbar->Create(hReleaseToolbarPager);
+
+#define ADD_TOOLBAR_BUTTON(id,iconID,lpszToolTip) pobj_ReleaseToolbar->Add(id,(HICON)LoadImage(hIconResInst,MAKEINTRESOURCE(iconID),IMAGE_ICON,16,16,0),lpszToolTip)
+#define ADD_TOOLBAR_SEPARATOR pobj_ReleaseToolbar->Add(0,0,0)
+ //ボタン類を追加
+ ADD_TOOLBAR_BUTTON(IDM_RELEASECOMPILE,IDI_RELEASECOMPILE,"リリース コンパイル(F6)");
+ ADD_TOOLBAR_BUTTON(IDM_RELEASERUN,IDI_RELEASERUN,"実行");
+#undef ADD_TOOLBAR_SEPARATOR
+#undef ADD_TOOLBAR_BUTTON
+
+ //ページャー設定
+ Pager_SetChild(hReleaseToolbarPager,pobj_ReleaseToolbar->GetHandle());
+
+ //サブクラス化
+ extern WNDPROC OldStandardToolbarProc;
+ OldStandardToolbarProc=(WNDPROC)GetWindowLong(pobj_ReleaseToolbar->GetHandle(),GWL_WNDPROC);
+ SetWindowLong(pobj_ReleaseToolbar->GetHandle(),GWL_WNDPROC,(long)StandardToolbarProc);
+
+ lpszText[0]=0;
+ return hReleaseToolbarPager;
+#else //THETEXT
+ return 0;
+#endif //THETEXT
+}
+
+//コンパイラ選択コンボボックスをレバーに追加
+HWND AddBand_SelectCompiler(HWND hRebar,int num,char *lpszText){
+
+ //コンボボックスを生成
+ extern HINSTANCE hInst;
+ extern HWND hSelectCompilerCombo;
+ hSelectCompilerCombo=CreateWindow("COMBOBOX",NULL,
+ WS_CHILD|WS_VSCROLL|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_DROPDOWN|CBS_HASSTRINGS|CBS_SORT,
+ 0,0,0,120,hRebar,NULL,hInst,NULL);
+
+ //サブクラス化
+ extern WNDPROC OldSelectCompilerComboProc;
+ OldSelectCompilerComboProc=(WNDPROC)GetWindowLong(hSelectCompilerCombo,GWL_WNDPROC);
+ SetWindowLong(hSelectCompilerCombo,GWL_WNDPROC,(long)SelectCompilerComboProc);
+
+ //フォントを設定
+ extern HFONT hStatusFont;
+ SendMessage(hSelectCompilerCombo,WM_SETFONT,(WPARAM)hStatusFont,0);
+
+ //コンボボックスに文字列を挿入
+ SendMessage(hSelectCompilerCombo,CB_ADDSTRING,0,(long)"Win32");
+ if(IsWow64()) SendMessage(hSelectCompilerCombo,CB_ADDSTRING,0,(long)"Win64");
+
+ //Win32を選択
+ SendMessage(hSelectCompilerCombo,CB_SETCURSEL,0,0);
+
+ lpszText[0]=0;
+ return hSelectCompilerCombo;
+}
+
+HWND AddBand_WebSearch(HWND hRebar,int num,char *lpszText){
+ //コンボボックスを生成
+ extern HINSTANCE hInst;
+ extern HWND hWebSearchCombo;
+ hWebSearchCombo=CreateWindow("COMBOBOX",NULL,
+ WS_CHILD|WS_VSCROLL|WS_VISIBLE|CBS_DROPDOWN|CBS_HASSTRINGS|CBS_AUTOHSCROLL,
+ 0,0,0,120,hRebar,NULL,hInst,NULL);
+
+ //サブクラス化
+ extern WNDPROC OldWebSearchProc;
+ OldWebSearchProc=(WNDPROC)GetWindowLong(hWebSearchCombo,GWL_WNDPROC);
+ SetWindowLong(hWebSearchCombo,GWL_WNDPROC,(long)WebSearchProc);
+ extern WNDPROC OldWebSearchEditProc;
+ OldWebSearchEditProc=(WNDPROC)GetWindowLong(GetWindow(hWebSearchCombo,GW_CHILD),GWL_WNDPROC);
+ SetWindowLong(GetWindow(hWebSearchCombo,GW_CHILD),GWL_WNDPROC,(long)WebSearchEditProc);
+
+ //フォントを設定
+ extern HFONT hStatusFont;
+ SendMessage(hWebSearchCombo,WM_SETFONT,(WPARAM)hStatusFont,0);
+
+ lstrcpy(lpszText,"WebSearch(F5):");
+
+
+
+ //Web検索文字列コンボボックスを初期化
+ int i;
+ SendMessage(hWebSearchCombo,CB_RESETCONTENT,0,0);
+ for(i=0;iWebStr[i][0]=='\0') break;
+ SendMessage(hWebSearchCombo,CB_ADDSTRING,0,(long)pobj_nv->WebStr[i]);
+ }
+ SendMessage(hWebSearchCombo,CB_LIMITTEXT,8192,0);
+
+ return hWebSearchCombo;
+}
Index: /ProjectEditor/ClassTree.cpp
===================================================================
--- /ProjectEditor/ClassTree.cpp (revision 3)
+++ /ProjectEditor/ClassTree.cpp (revision 3)
@@ -0,0 +1,605 @@
+#include "Common.h"
+
+#if defined(JPN)
+//日本語
+#include "pj_msg_jpn.h"
+#else
+//英語
+#include "pj_msg_eng.h"
+#endif
+
+
+CClassTreeView *pobj_ClassTreeView;
+
+BOOL bSearchingClasses,bRetrySearchingClasses;
+
+
+int CClassTreeView::hash_default(LONG_PTR lpdata){
+ return lpdata%MAX_HASH;
+}
+void CClassTreeView::AddValidItem(HTREEITEM hItem,int iFileNum){
+ //ハッシュ値を取得
+ int key;
+ key=hash_default((LONG_PTR)hItem);
+
+ //格納位置を取得
+ TREEHASH *pth;
+ pth=&tree_data[key];
+ while(pth->hItem){
+ if(pth->hItem==hItem){
+ //既に存在するときは抜け出す
+ return;
+ }
+ if(pth->pNextData==0){
+ pth->pNextData=(TREEHASH *)HeapAlloc(hHeap,0,sizeof(TREEHASH));
+ pth=pth->pNextData;
+ break;
+ }
+ pth=pth->pNextData;
+ }
+
+ pth->hItem=hItem;
+ pth->iFileNum=iFileNum;
+ pth->pNextData=0;
+}
+
+BOOL CClassTreeView::delete_check(HTREEITEM hItem){
+ //ハッシュ値を取得
+ int key;
+ key=hash_default((LONG_PTR)hItem);
+
+ TREEHASH *pth;
+ pth=&tree_data[key];
+ while(pth->hItem){
+ if(pth->hItem==hItem) return 1;
+
+ if(pth->pNextData==0) break;
+ pth=pth->pNextData;
+ }
+ return 0;
+}
+
+void CClassTreeView::DeleteInvalidItems(HTREEITEM hItem){
+ HTREEITEM hChildItem;
+ while(hItem){
+ if(!delete_check(hItem)){
+ HTREEITEM hTemp;
+ hTemp=hItem;
+
+ hItem=TreeView_GetNextSibling(hTreeWnd,hItem);
+
+ TreeView_DeleteItem(hTreeWnd,hTemp);
+ continue;
+ }
+
+ hChildItem=TreeView_GetChild(hTreeWnd,hItem);
+ if(hChildItem){
+ DeleteInvalidItems(hChildItem);
+ }
+
+ hItem=TreeView_GetNextSibling(hTreeWnd,hItem);
+ }
+}
+
+void CClassTreeView::DeleteTreeHash(TREEHASH *pth){
+ if(pth->hItem && (iNowFile==-1 || iNowFile==pth->iFileNum)){
+ if(pth->pNextData){
+ DeleteTreeHash(pth->pNextData);
+ HeapDefaultFree(pth->pNextData);
+ pth->pNextData=0;
+ }
+ pth->hItem=0;
+ }
+}
+
+
+HTREEITEM CClassTreeView::insert(HTREEITEM hParentItem,int flag,char *lpszName,int iFileNum){
+ char temporary[255];
+
+ TVITEM tvItem;
+ tvItem.pszText=temporary;
+ tvItem.cchTextMax=255;
+ HTREEITEM hNextItem;
+ hNextItem=TreeView_GetChild(hTreeWnd,hParentItem);
+ while(hNextItem){
+ tvItem.mask=TVIF_HANDLE|TVIF_TEXT;
+ tvItem.hItem=hNextItem;
+ TreeView_GetItem(hTreeWnd,&tvItem);
+ if(lstrcmp(lpszName,tvItem.pszText)==0){
+ //既に挿入済みの場合
+ AddValidItem(hNextItem,iFileNum);
+ return hNextItem;
+ }
+
+ hNextItem=TreeView_GetNextSibling(hTreeWnd,hNextItem);
+ }
+
+
+ TV_INSERTSTRUCT tv;
+ tv.hInsertAfter=TVI_SORT;
+ tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIS_EXPANDED ;
+ tv.hParent=hParentItem;
+ tv.item.pszText=lpszName;
+
+ if(flag==CTV_ROOT){
+ tv.item.iImage=3;
+ tv.item.iSelectedImage=3;
+ }
+ if(flag==CTV_FOLDER){
+ tv.item.iImage=0;
+ tv.item.iSelectedImage=0;
+ }
+ else if(flag==CTV_GLOBAL_PROC){
+ tv.item.iImage=5;
+ tv.item.iSelectedImage=5;
+ }
+ else if(flag==CTV_CLASS){
+ tv.item.iImage=2;
+ tv.item.iSelectedImage=2;
+ }
+ else if(flag==CTV_PUBLIC_MEMBER){
+ tv.item.iImage=4;
+ tv.item.iSelectedImage=4;
+ }
+ else if(flag==CTV_PUBLIC_METHOD){
+ tv.item.iImage=5;
+ tv.item.iSelectedImage=5;
+ }
+ else if(flag==CTV_PRIVATE_MEMBER){
+ tv.item.iImage=6;
+ tv.item.iSelectedImage=6;
+ }
+ else if(flag==CTV_PRIVATE_METHOD){
+ tv.item.iImage=7;
+ tv.item.iSelectedImage=7;
+ }
+
+ hNextItem=TreeView_InsertItem(hTreeWnd,&tv);
+ AddValidItem(hNextItem,iFileNum);
+ return hNextItem;
+}
+
+
+
+CClassTreeView::CClassTreeView(){
+ memset(this,0,sizeof(CClassTreeView));
+}
+CClassTreeView::~CClassTreeView(){
+ while(bSearchingClasses) Sleep(10);
+
+ iNowFile=-1;
+
+ int i;
+ for(i=0;ipProcInfo){
+ //プロシージャ情報のメモリを解放
+ for(i=0;iNumberOfProcedures;i++){
+ HeapDefaultFree(pobj_ClassTreeView->pProcInfo[i].name);
+ }
+ HeapDefaultFree(pobj_ClassTreeView->pProcInfo);
+ pobj_ClassTreeView->pProcInfo=0;
+ }
+}
+void CClassTreeView::init(HWND hwnd,int iFileNum){
+ hTreeWnd=hwnd;
+
+ iNowFile=iFileNum;
+
+ int i;
+ for(i=0;iinsert(
+ hGlobalProcedureFolder,
+ CTV_GLOBAL_PROC,
+ lpszName,
+ iFileNum);
+}
+
+HTREEITEM CClassTreeView::insert_code_item(HTREEITEM hParentItem,int flag,char *lpszName,int iFileNum,char *pBuf,int p){
+ int i4;
+ i4=NumberOfProcedures;
+ pProcInfo=(PROCINFO *)HeapReAlloc(hHeap,0,pProcInfo,sizeof(PROCINFO)*(i4+1));
+ pProcInfo[i4].name=(char *)HeapAlloc(hHeap,0,lstrlen(lpszName)+1);
+ lstrcpy(pProcInfo[i4].name,lpszName);
+ pProcInfo[i4].FileNum=iFileNum;
+
+ //コード位置
+ pProcInfo[i4].code_pos=p;
+
+ //ツリーアイテムを挿入
+ HTREEITEM hTempItem;
+ hTempItem=insert(
+ hParentItem,
+ flag,
+ lpszName,
+ iFileNum);
+
+ pProcInfo[i4].hTreeItem=hTempItem;
+
+ NumberOfProcedures++;
+
+ return hTempItem;
+}
+
+void CClassTreeView::InsertClassFolder(char *lpszName,int iFileNum,char *pBuf,int p){
+ hNowClassFolder=insert_code_item(hRootFolder,CTV_CLASS,lpszName,iFileNum,pBuf,p);
+}
+void CClassTreeView::InsertClassMember(int flag,char *lpszName,int iFileNum,char *pBuf,int p){
+ insert_code_item(hNowClassFolder,flag,lpszName,iFileNum,pBuf,p);
+}
+
+void CClassTreeView::finish(){
+ DeleteInvalidItems(TreeView_GetRoot(hTreeWnd));
+}
+
+
+void AnalysisClass(char *pBuf,int *p,int iFileNum){
+ int i2;
+ i2=*p;
+
+
+ CClassInfo *pobj_ClassInfo;
+ pobj_ClassInfo=new CClassInfo();
+
+ pobj_ClassInfo->Analyze(pBuf,p);
+
+
+ //クラスフォルダを挿入
+ pobj_ClassTreeView->InsertClassFolder(
+ pobj_ClassInfo->ClassName,
+ iFileNum,
+ pBuf,
+ i2);
+
+
+
+ ///////////////////////////////
+ // メンバ及びメソッドを挿入
+ ///////////////////////////////
+
+ int i;
+ for(i=0;iMemberNum;i++){
+ int flag;
+ if(pobj_ClassInfo->pMemberInfo[i].dwProc==0){
+ //メンバ変数
+ if(pobj_ClassInfo->pMemberInfo[i].dwAccess==ACCESS_PUBLIC){
+ //公開
+ flag=CTV_PUBLIC_MEMBER;
+ }
+ else{
+ //非公開
+ flag=CTV_PRIVATE_MEMBER;
+ }
+ }
+ else{
+ //メソッド
+ if(pobj_ClassInfo->pMemberInfo[i].dwAccess==ACCESS_PUBLIC){
+ //公開
+ flag=CTV_PUBLIC_METHOD;
+ }
+ else{
+ //非公開
+ flag=CTV_PRIVATE_METHOD;
+ }
+ }
+ pobj_ClassTreeView->InsertClassMember(flag,pobj_ClassInfo->pMemberInfo[i].pName,iFileNum,pBuf,pobj_ClassInfo->pMemberInfo[i].code_pos);
+ }
+
+
+ delete pobj_ClassInfo;
+ pobj_ClassInfo=0;
+}
+
+
+
+void SetClassTreeFromOneFile(char *lpszFilePath,int iFileNum){
+ extern PROJECTINFO ProjectInfo;
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ int i2,i3,i4,WndNum;
+ char *pBuf;
+ HWND hChild;
+ char temporary[GENERAL_SIZE];
+
+ hChild=GetWindow(hClient,GW_CHILD);
+ while(hChild){
+ WndNum=GetWndNum(hChild);
+ if(IS_DOCUMENT_TEXT(MdiInfo[WndNum].DocType)){
+ if(lstrcmpi(MdiInfo[WndNum].path,lpszFilePath)==0) break;
+ }
+ hChild=GetNextWindow(hChild,GW_HWNDNEXT);
+ }
+
+ if(hChild){
+ //すでに指定されたファイルが開かれている場合
+ pBuf=MdiInfo[WndNum].pmti->buffer;
+ }
+ else{
+ //開かれていない場合
+ pBuf=ReadBuffer(lpszFilePath);
+ if(!pBuf) pBuf=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+ }
+ for(i2=0;;i2++){
+ if(pBuf[i2]=='\0') break;
+ while(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n'&&pBuf[i2+2]=='\r'&&pBuf[i2+3]=='\n') i2+=2;
+ if(i2==0||(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n')){
+ if(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n') i2+=2;
+ while(pBuf[i2]>='0'&&pBuf[i2]<='9') i2++;
+ while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+
+ i4=i2;
+ for(i3=0;;i2++,i3++){
+ if(!IsVariableChar(pBuf[i2])){
+ temporary[i3]=0;
+ break;
+ }
+ temporary[i3]=pBuf[i2];
+ }
+ if(pBuf[i2]=='\0') break;
+
+ if(lstrcmpi(temporary,"Class")==0||
+ lstrcmpi(temporary,"Type")==0||
+ lstrcmpi(temporary,"Interface")==0){
+
+ /////////////////////////////
+ // クラスの解析
+ /////////////////////////////
+ AnalysisClass(pBuf,&i4,iFileNum);
+
+ i2=i4-1;
+ continue;
+ }
+
+ int sw;
+ if(lstrcmpi(temporary,"Sub")==0) sw=1;
+ else if(lstrcmpi(temporary,"Function")==0) sw=2;
+ else sw=0;
+
+ if(sw){
+ //Sub/Function
+ while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+ for(i3=0;;i2++,i3++){
+ if(!IsVariableChar(pBuf[i2])){
+ temporary[i3]=0;
+ break;
+ }
+ temporary[i3]=pBuf[i2];
+ }
+
+ if(lstrcmpi(temporary,"Export")==0){
+ //Export修飾子はとばす
+ while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+
+ for(i3=0;;i2++,i3++){
+ if(!IsVariableChar(pBuf[i2])){
+ temporary[i3]=0;
+ break;
+ }
+ temporary[i3]=pBuf[i2];
+ }
+ }
+
+ i4=pobj_ClassTreeView->NumberOfProcedures;
+ pobj_ClassTreeView->pProcInfo=(PROCINFO *)HeapReAlloc(hHeap,0,pobj_ClassTreeView->pProcInfo,sizeof(PROCINFO)*(i4+1));
+ pobj_ClassTreeView->pProcInfo[i4].name=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+ lstrcpy(pobj_ClassTreeView->pProcInfo[i4].name,temporary);
+ pobj_ClassTreeView->pProcInfo[i4].FileNum=iFileNum;
+
+ //定義行の選択範囲
+ pobj_ClassTreeView->pProcInfo[i4].code_pos=i2;
+
+ //パラメータ部
+ while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+ if(pBuf[i2]=='('){
+ int IsStr,PareNum;
+ for(i2++,i3=0,IsStr=0,PareNum=0;;i2++,i3++){
+ if(pBuf[i2]=='\"') IsStr^=1;
+ if(pBuf[i2]=='('&&IsStr==0) PareNum++;
+ if(pBuf[i2]==')'&&IsStr==0){
+ PareNum--;
+ if(PareNum<0){
+ temporary[i3]=0;
+ break;
+ }
+ }
+ if(pBuf[i2]=='\0') break;
+ temporary[i3]=pBuf[i2];
+ }
+ //temporaryはパラメータの内容が格納されるが、不要
+ }
+
+ for(;;i2++){
+ if(IsCommandDelimitation(pBuf,i2)){
+ break;
+ }
+ if((pBuf[i2]=='a'||pBuf[i2]=='A')&&(pBuf[i2+1]=='s'||pBuf[i2+1]=='S')&&(pBuf[i2+2]==' '||pBuf[i2+2]=='\t')){
+ i2+=3;
+ while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+ for(i3=0;;i2++,i3++){
+ if(!IsVariableChar(pBuf[i2])){
+ temporary[i3]=0;
+ break;
+ }
+ temporary[i3]=pBuf[i2];
+ }
+ //temporaryには型情報が格納されるが、不要
+ break;
+ }
+ }
+
+ //ツリーアイテムを挿入
+ HTREEITEM hTempItem;
+ hTempItem=pobj_ClassTreeView->InsertGlobalProcedure(
+ CTV_GLOBAL_PROC,
+ pobj_ClassTreeView->pProcInfo[i4].name,
+ iFileNum);
+ pobj_ClassTreeView->pProcInfo[i4].hTreeItem=hTempItem;
+
+ pobj_ClassTreeView->NumberOfProcedures++;
+
+ i2--;
+ }
+ }
+ }
+
+ if(!hChild) HeapDefaultFree(pBuf);
+}
+
+void SetProcedureTreeData(void *temp_iFileNum){
+ extern PROJECTINFO ProjectInfo;
+ int i;
+ char temporary[MAX_PATH];
+ BOOL bExpand;
+ TVITEM tvItem;
+ SCROLLINFO si;
+
+ int iFileNum;
+ iFileNum=(int)temp_iFileNum;
+
+ if(bSearchingClasses){
+ bRetrySearchingClasses=1;
+ _endthread();
+ return;
+ }
+ bSearchingClasses=1;
+
+ if(pobj_ClassTreeView->pProcInfo){
+wait_repeat:
+ Sleep(700);
+ if(bRetrySearchingClasses){
+ bRetrySearchingClasses=0;
+ goto wait_repeat;
+ }
+
+ PROCINFO *pNewProcInfo;
+ pNewProcInfo=(PROCINFO *)HeapAlloc(hHeap,0,pobj_ClassTreeView->NumberOfProcedures*sizeof(PROCINFO));
+ int NewProcNum;
+ NewProcNum=0;
+
+ //プロシージャ情報のメモリを解放
+ for(i=0;iNumberOfProcedures;i++){
+ if(iFileNum==-1 || iFileNum==pobj_ClassTreeView->pProcInfo[i].FileNum){
+ HeapDefaultFree(pobj_ClassTreeView->pProcInfo[i].name);
+ }
+ else{
+ pNewProcInfo[NewProcNum]=pobj_ClassTreeView->pProcInfo[i];
+ NewProcNum++;
+ }
+ }
+ HeapDefaultFree(pobj_ClassTreeView->pProcInfo);
+
+ pobj_ClassTreeView->pProcInfo=pNewProcInfo;
+ pobj_ClassTreeView->NumberOfProcedures=NewProcNum;
+ }
+ else{
+ pobj_ClassTreeView->pProcInfo=(PROCINFO *)HeapAlloc(hHeap,0,1);
+ pobj_ClassTreeView->NumberOfProcedures=0;
+ }
+
+ extern HWND hProcedureTreeView;
+ tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
+ if(tvItem.hItem){
+ TreeView_GetItem(hProcedureTreeView,&tvItem);
+ if(tvItem.state&TVIS_EXPANDED){
+ bExpand=1;
+
+ si.cbSize=sizeof(SCROLLINFO);
+ si.fMask=SIF_POS;
+ GetScrollInfo(hProcedureTreeView,SB_VERT,&si);
+ }
+ else bExpand=0;
+ }
+ else bExpand=1;
+
+
+ pobj_ClassTreeView->init(hProcedureTreeView,iFileNum);
+
+ //ルートフォルダ
+ pobj_ClassTreeView->InsertRootFolder();
+
+ //グローバル関数フォルダ
+ pobj_ClassTreeView->InsertGlobalProcedureFolder();
+
+
+ //描画をロック
+ LockWindowUpdate(hProcedureTreeView);
+
+ if(iFileNum==-1){
+ //プロジェクトのすべてのファイルを解析
+ for(i=0;iiNum;i++){
+ ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[i]->GetFullPath(temporary);
+
+ SetClassTreeFromOneFile(temporary,i);
+ }
+
+ //不要になったアイテムを除去
+ pobj_ClassTreeView->finish();
+ }
+ else{
+ /////////////////////////////////
+ // 編集中のファイルのみを解析
+ /////////////////////////////////
+
+ ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[iFileNum]->GetFullPath(temporary);
+
+ SetClassTreeFromOneFile(temporary,iFileNum);
+ }
+
+ //不要になったアイテムを除去
+ pobj_ClassTreeView->finish();
+
+ //描画ロックを解除
+ LockWindowUpdate(0);
+
+
+ if(bExpand){
+ TreeView_Expand(hProcedureTreeView,pobj_ClassTreeView->hRootFolder,TVE_EXPAND);
+
+ SetScrollInfo(hProcedureTreeView,SB_VERT,&si,1);
+ }
+
+
+ bSearchingClasses=0;
+ if(bRetrySearchingClasses){
+ bRetrySearchingClasses=0;
+ ResetClassTree(iFileNum);
+ }
+
+ if(pobj_ClassTreeView->bCloseSwitch){
+ //コード解析中に終了ボタンが押されたとき
+ PostMessage(hOwner,WM_CLOSE,0,0);
+ }
+ if(pobj_ClassTreeView->bShowSwitch){
+ //コード解析中にクラスビューがダブルクリックされたとき
+ extern HWND hProjectViewTab;
+ PostMessage(hProjectViewTab,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
+ pobj_ClassTreeView->bShowSwitch=0;
+ }
+
+ _endthread();
+}
+void ResetClassTree(int iFileNum){
+ _beginthread(SetProcedureTreeData,0,(void *)iFileNum);
+}
Index: /ProjectEditor/CodeFormatter.cpp
===================================================================
--- /ProjectEditor/CodeFormatter.cpp (revision 3)
+++ /ProjectEditor/CodeFormatter.cpp (revision 3)
@@ -0,0 +1,249 @@
+#include "common.h"
+
+// インデント関連
+
+int IsIndentAdditionCommand_FromBuffer(char *buffer);
+int IsIndentDecreaseCommand_FromBuffer(char *buffer);
+
+char *CodeFormatter(char *lpszReadBuffer){
+ int WndNum;
+ WndNum=GetNowWndNum();
+
+ if(MdiInfo[WndNum].DocType!=WNDTYPE_BASIC){
+ goto NonFormater;
+ }
+
+ char *lpszTempReadBuffer;
+ lpszTempReadBuffer=(char *)HeapAlloc(hHeap,0,lstrlen(lpszReadBuffer)+1);
+ lstrcpy(lpszTempReadBuffer,lpszReadBuffer);
+
+ //CRLFをLFに変換
+ ChangeReturnCode(lpszTempReadBuffer);
+
+ DeleteComment(lpszTempReadBuffer);
+
+ //カッコの相互関係をチェック
+ if(!CheckParenthesis(lpszTempReadBuffer)){
+ HeapDefaultFree(lpszTempReadBuffer);
+ goto NonFormater;
+ }
+
+
+
+ ////////////////////////////////////
+ // インデントの初期TAB文字数を取得
+ ////////////////////////////////////
+
+ char *pBuf;
+ pBuf=MdiInfo[WndNum].pmti->buffer;
+
+ //カーソルバッファ位置を取得
+ int i,i2;
+ i=GetBufferIndexFromCaretPos(pBuf,
+ MdiInfo[WndNum].pmti->StartCaretPos.x,
+ MdiInfo[WndNum].pmti->StartCaretPos.y);
+ int StartX=MdiInfo[WndNum].pmti->StartCaretPos.x;
+
+ //現在の行のインデントをコピー(iFirstIndent_Speciallyにタブ数を格納)
+ int iFirstIndent_Specially=0;
+ for(i2=i;i2>0;i2--){
+ if(pBuf[i2-1]=='\r'&&pBuf[i2]=='\n'){
+
+ i=i2-1;
+
+ i2++;
+
+ int x=0;
+ while(pBuf[i2]=='\t'&&x0;i--){
+ if(
+ pBuf[i-1]=='\r'&&pBuf[i]=='\n'&&
+ (!(pBuf[i+1]=='\r'&&pBuf[i+2]=='\n'))
+ ){
+ i++;
+ break;
+ }
+ }
+
+ int iIndent;
+ for(iIndent=0;;iIndent++){
+ if(pBuf[i+iIndent]!='\t') break;
+ }
+
+ if(MdiInfo[WndNum].DocType==WNDTYPE_BASIC){
+ //インデント追加のコマンドかどうかを判断
+ if(IsIndentAdditionCommand_FromBuffer(pBuf+i+iIndent)) iIndent++;
+ }
+
+
+
+ //////////////////////////////
+ // 各行のTAB文字数を計算
+ //////////////////////////////
+
+ int *pTabs,LineCount=0;
+ pTabs=(int *)HeapAlloc(hHeap,0,(lstrlen(lpszTempReadBuffer)+1)*sizeof(int));
+
+ char *pTemp;
+ pTemp=(char *)HeapAlloc(hHeap,0,lstrlen(lpszTempReadBuffer)+1);
+
+ i=0;
+ BOOL bInterface=0;
+ while(1){
+ while(lpszTempReadBuffer[i]=='\t'||lpszTempReadBuffer[i]==' ') i++;
+
+ int PareNum,BracketNum;
+ PareNum=0,BracketNum=0;
+
+ pTabs[LineCount]=0;
+
+ int MultiLine=0;
+ for(i2=0;;i++,i2++){
+
+ if(lpszTempReadBuffer[i-1]=='('||lpszTempReadBuffer[i-1]=='[') PareNum++;
+ else if(lpszTempReadBuffer[i-1]==')'||lpszTempReadBuffer[i-1]==']') PareNum--;
+
+ if(lpszTempReadBuffer[i]=='\n'||lpszTempReadBuffer[i]=='\0'){
+ if((lpszTempReadBuffer[i-1]=='('||lpszTempReadBuffer[i-1]==',')&&lpszTempReadBuffer[i]){
+ //パラメータ改行
+
+ i++;
+ MultiLine++;
+
+ pTabs[LineCount+MultiLine]=PareNum;
+
+ while(lpszTempReadBuffer[i]=='\n'){
+ i++;
+ MultiLine++;
+
+ pTabs[LineCount+MultiLine]=PareNum;
+ }
+ continue;
+ }
+ if(lpszTempReadBuffer[i-1]=='_'&&lpszTempReadBuffer[i]){
+ //任意改行
+ i++;
+ i2--;
+
+ MultiLine++;
+
+ pTabs[LineCount+MultiLine]=1;
+ continue;
+ }
+
+ pTemp[i2]=0;
+ break;
+ }
+ pTemp[i2]=lpszTempReadBuffer[i];
+ }
+
+
+ //インデント減少コマンドかどうかを判定
+ int f;
+ if(f=IsIndentDecreaseCommand_FromBuffer(pTemp)){
+ if(iIndent>0) iIndent--;
+ if(f==2){
+ if(iIndent>0) iIndent--;
+ }
+
+ if(f==3) bInterface=0;
+ }
+
+ if(iFirstIndent_Specially!=-1){
+ if(iIndent-iFirstIndent_Specially<0) iFirstIndent_Specially=iIndent;
+
+ pTabs[LineCount]+=iIndent-iFirstIndent_Specially;
+
+ iFirstIndent_Specially=-1;
+ }
+ else pTabs[LineCount]+=iIndent;
+ LineCount++;
+
+ while(MultiLine){
+ pTabs[LineCount]+=iIndent;
+ LineCount++;
+
+ MultiLine--;
+ }
+
+
+
+ //インデント増加コマンドかどうかを判定
+ if((f=IsIndentAdditionCommand_FromBuffer(pTemp))&&bInterface==0){
+ iIndent++;
+ if(f==2) iIndent++;
+
+ if(f==3) bInterface=1;
+ }
+
+
+ if(lpszTempReadBuffer[i]=='\0') break;
+ i++;
+ }
+
+
+
+ //////////////////////////
+ // インデント整形
+ //////////////////////////
+
+ char *lpszNewBuffer,temp2[1024];
+ lpszNewBuffer=(char *)HeapAlloc(hHeap,0,lstrlen(lpszReadBuffer)+8192);
+ lpszNewBuffer[0]=0;
+
+ i=0;
+ bInterface=0;
+ LineCount=0;
+ while(1){
+ while(lpszReadBuffer[i]=='\t'||lpszReadBuffer[i]==' ') i++;
+
+ for(i2=0;;i++,i2++){
+
+ if(IS_RETURN(lpszReadBuffer,i)||lpszReadBuffer[i]=='\0'){
+ pTemp[i2]=0;
+ break;
+ }
+ pTemp[i2]=lpszReadBuffer[i];
+ }
+
+
+ memset(temp2,'\t',pTabs[LineCount]);
+ temp2[pTabs[LineCount]]=0;
+ LineCount++;
+
+ lstrcat(lpszNewBuffer,temp2);
+ lstrcat(lpszNewBuffer,pTemp);
+
+
+
+ if(lpszReadBuffer[i]=='\0') break;
+ i+=2;
+
+ lstrcat(lpszNewBuffer,"\r\n");
+ }
+
+ HeapDefaultFree(pTemp);
+ HeapDefaultFree(lpszTempReadBuffer);
+
+ HeapDefaultFree(pTabs);
+
+ return lpszNewBuffer;
+
+
+
+NonFormater:
+ //インデント整形は行わない
+ lpszNewBuffer=(char *)HeapAlloc(hHeap,0,lstrlen(lpszReadBuffer)+1);
+ lstrcpy(lpszNewBuffer,lpszReadBuffer);
+ return lpszNewBuffer;
+}
Index: /ProjectEditor/Common.h
===================================================================
--- /ProjectEditor/Common.h (revision 3)
+++ /ProjectEditor/Common.h (revision 3)
@@ -0,0 +1,1286 @@
+#define STRICT
+#define OEMRESOURCE
+#define _CRT_SECURE_NO_DEPRECATE //セキュリティ警告を出さない
+#define _CRT_NONSTDC_NO_DEPRECATE
+#include
+#include
+#include
+#include
+#include "../htmlhelp.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include "nkf_class.h"
+#include "WebSearch.h"
+#include "ruler.h"
+#include "TabCtrl.h"
+#include "ExtensionLink.h"
+#include "HtmlAnalysis.h"
+#include "FileTree.h"
+#include "menu.h"
+#include "LuxCtrl.h"
+#include "BREGEXP.H"
+#include "../BasicCompiler32/CommandValue.h"
+#include "../BasicCompiler_Common/BasicFixed.h"
+
+
+typedef struct _charrange {
+ LONG cpMin;
+ LONG cpMax;
+} CHARRANGE;
+
+
+#ifdef THETEXT
+#else
+#include "Attach.h"
+#include "Debugger.h"
+#endif
+
+
+#pragma comment(lib, "wininet.lib")
+
+
+
+#ifdef THETEXT
+
+////////////////////////////
+// TheTextのバージョン情報
+////////////////////////////
+#define APPLICATION_NAME "TheText"
+#define VERSION_APPLI_NAME APPLICATION_NAME
+#define VERSION_STRING "1.02"
+
+#else
+
+/////////////////////////////////////////////////
+// ActiveBasic/ProjectEditorのバージョン情報
+/////////////////////////////////////////////////
+#define APPLICATION_NAME "ActiveBasic 5.0"
+#define VERSION_APPLI_NAME APPLICATION_NAME
+#define VERSION_STRING "5.00.00 β8"
+
+#endif
+
+
+//シリアルIDから算出されるハッシュ値
+//シリアルID = 7641325089125189
+#define SERIAL_HASH_64 183391802137311458
+
+
+
+#define WIN32_COMPILER_NAME "BasicCompiler32.exe"
+#define WIN64_COMPILER_NAME "BasicCompiler64.exe"
+
+
+#ifndef IMAGE_FILE_MACHINE_AMD64
+#define IMAGE_FILE_MACHINE_AMD64 0x8664 // AMD64 (K8)
+#endif
+
+
+#if defined(JPN)
+
+#ifdef THETEXT
+//TheText日本語
+#include "../res_TheText/resource.h"
+#include "common_msg_jpn.h"
+#else
+//日本語
+#include "../res/resource.h"
+#include "common_msg_jpn.h"
+#endif
+
+#else
+//英語
+#include "../res_e/resource.h"
+#include "common_msg_eng.h"
+#endif
+
+//アイコンリソース
+#include "../icon_res/resource.h"
+
+
+
+
+#define GENERAL_SIZE 8192
+#define VN_SIZE 512
+#define MAX_ARRAYDIM 16
+
+#define MAX_WNDNUM 255
+
+
+#ifdef _AMD64_
+#else
+typedef long LONG_PTR;
+typedef DWORD ULONG_PTR;
+#endif
+
+//ファイルタイプ
+#define FT_BASICPROGRAM 1
+#define FT_SUBPROGRAM 2
+#define FT_TEXT 3
+#define FT_PROJECT 4
+#define FT_ICON 5
+#define FT_HTML 6
+#define FT_OTHER 0
+
+#define BMPNUM_STANDARDTOOLBAR 10 //hDefaultToolbarのビットマップ数
+#define SEPNUM_STANDARDTOOLBAR 4 //hDefaultToolbarのセパレータ数
+#define BMPNUM_DEBUGGERTOOLBAR 8 //hDebuggerToolbarのビットマップ数
+#define SEPNUM_DEBUGGERTOOLBAR 2 //hDebuggerToolbarのセパレータ数
+#define BMPNUM_RADTOOLBAR 18 //コントロール挿入用ツールバーのビットマップ数(区切り用BMPを最後の1つに用意する)
+#define SEPNUM_RADTOOLBAR 3 //コントロール挿入用ツールバーのセパレータ数
+
+//MDIクライアントウィンドウ下のドキュメントウィンドウタイプ
+#define WNDTYPE_BASIC 1
+#define WNDTYPE_TEXT 2
+#define WNDTYPE_RAD 3
+#define WNDTYPE_MENU 4
+#define WNDTYPE_ICONEDIT 5
+#define WNDTYPE_HTML 6
+
+#define IS_DOCUMENT_TEXT(a) (a==WNDTYPE_BASIC||a==WNDTYPE_TEXT||a==WNDTYPE_HTML)
+
+#define IS_RETURN(buffer,p) (buffer[p]=='\r'&&buffer[p+1]=='\n')
+#define IS_BLANK(c) (c==' '||c=='\t')
+
+//Rebarコントロールの個数(レバー追加)
+#define MAX_REBARBANDS 5
+
+//RebarコントロールのID(レバー追加)
+#define ID_DOCCOMBO 1
+#define ID_STANDARDTOOLBAR 2
+#define ID_RELEASETOOLBAR 3
+#define ID_DEBUGGERTOOLBAR 4
+#define ID_SELECTCOMPILERCOMBO 5
+#define ID_WEB_SEARCH 6
+
+//検索コンボボックスの最大リスト数
+#define MAX_FINDLIST 20
+
+#define ID_FIRSTCHILD 100
+
+
+//タブカラー
+#define TABCOLOR_GRAY RGB(230,230,230) //灰色
+#define TABCOLOR_WHITE RGB(255,255,255) //白
+#define TABCOLOR_RED RGB(255,200,200) //赤
+#define TABCOLOR_GREEN RGB(200,255,200) //緑
+#define TABCOLOR_BLUE RGB(200,220,255) //青
+#define TABCOLOR_YELLOW RGB(255,255,180) //黄色
+
+
+//////////////////////////////////////////
+// BasicCompiler、ProjectEditor共通の定数
+//////////////////////////////////////////
+
+//サイズ変更枠の太さ
+#define LEVER_THICK 5
+
+#define WM_SHOWERROR WM_USER+70 //エラー表示メッセージ
+
+#define WM_SETCOMPILEVIEW WM_USER+71 //コンパイラウィンドウが表示されたとき
+#define WM_DESTROYCOMPILEVIEW WM_USER+72 //コンパイラウィンドウが破棄されたとき
+
+#define WM_SETDEBUGGERBASE WM_USER+73 //デバッガベースウィンドウが表示されたとき
+#define WM_DESTROYDEBUGGERBASE WM_USER+74 //デバッガベースウィンドウが破棄されたとき
+
+#define WM_SETDEBUGGERVIEW WM_USER+75 //デバッガウィンドウが表示されたとき
+#define WM_DESTROYDEBUGGERVIEW WM_USER+76 //デバッガウィンドウが表示されたとき
+
+///////////////////////////////////////////
+
+
+#define WM_RESETCARETPOS WM_USER+80 //オートスクロールスレッドからのキャレット設定
+
+#define WM_SEARCH_TAB_CREATE WM_USER+90 //Web検索のタブアイテムの生成メッセージ
+#define WM_SEARCH_TAB_CLOSE WM_USER+91 //Web検索のタブアイテムの破棄メッセージ
+
+//SideWeb
+#define WM_BROWS_CREATE WM_USER+100
+#define WM_BROWS_DESTROY WM_USER+101
+#define WM_BROWS_GO WM_USER+102
+#define WM_BROWS_NAVI WM_USER+103
+
+
+
+#define MAX_HASH 32768
+
+
+//////////////////////////////////
+// メインウィンドウのタイマーID
+
+#define ID_TIMER_BACKUP 10
+#define ID_DEBUGSAFTY 20
+
+// ここまで
+//////////////////////////////////
+
+
+
+extern HANDLE hHeap;
+extern HINSTANCE hInst,hResInst,hIconResInst;
+extern HWND hOwner;
+extern HWND hClient;
+extern int ScreenX,ScreenY;
+extern char pj_editor_Dir[MAX_PATH];
+
+extern BOOL bProfessional;
+
+
+//アルファブレンド用のAPI
+#define WS_EX_LAYERED 0x00080000
+#define LWA_ALPHA 0x00000002
+typedef BOOL (WINAPI *FWINLAYER)(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags );
+
+
+
+//新規プロジェクトのベース
+#define BASE_VOID 0
+#define BASE_PROMPT 1
+#define BASE_NORMAL 2
+
+struct POINTANDSIZE{
+ POINT pos;
+ SIZE size;
+};
+
+
+
+//////////////////////////////////////////
+// リソース ヘッダ(アイコン、カーソル用)
+typedef struct{
+ WORD idReserved;
+ WORD idType;
+ WORD idCount;
+}ICONDIR,CURSORDIR;
+
+////////////////////////////
+//.icoファイルのヘッダ情報
+struct ICONDIRENTRY{
+ BYTE bWidth;
+ BYTE bHeight;
+ BYTE bColorCount;
+ BYTE bReserved;
+ WORD wPlanes;
+ WORD wBitCount;
+ DWORD dwBytesInRes;
+ DWORD dwImageOffset;
+};
+
+
+/////////////////////
+//MDIウィンドウ情報
+
+#define MAX_UNDONUM 300//512未完成
+#define MAX_ICONEDIT_UNDONUM 32
+
+#define TEXTEDIT_UNDO_KEY 1
+#define TEXTEDIT_UNDO_PASTE 2
+#define TEXTEDIT_UNDO_SELKEY 3
+struct TEXTEDIT_UNDOSTATE{
+ int NowPos;
+ int Command[MAX_UNDONUM];
+ char *KeyStr[MAX_UNDONUM];
+ char *DelStr[MAX_UNDONUM];
+ CHARRANGE Range[MAX_UNDONUM];
+ CHARRANGE DelRange[MAX_UNDONUM];
+};
+
+struct RAD_UNDOSTATE_NAME{
+ char *name;
+ char *HandleName;
+ char *CallBackName;
+};
+#define RAD_UNDO_INSERTWND 1
+#define RAD_UNDO_DELETEWND 2
+#define RAD_UNDO_INSERTITEM 3
+#define RAD_UNDO_DELETEITEM 4
+#define RAD_UNDO_NAME 5
+#define RAD_UNDO_CAPTION 6
+#define RAD_UNDO_FONT 7
+#define RAD_UNDO_BGCOLOR 8
+#define RAD_UNDO_WINDOWMENU 9
+#define RAD_UNDO_ICONRES 10
+#define RAD_UNDO_STYLE 11
+#define RAD_UNDO_EXSTYLE 12
+#define RAD_UNDO_POSITION 13
+#define RAD_UNDO_IMAGESTATE 14
+#define RAD_UNDO_TYPE 15
+struct RAD_UNDOSTATE{
+ int NowPos;
+ int Command[MAX_UNDONUM];
+ int SelectItemNum[MAX_UNDONUM];
+ DWORD lpdwData[MAX_UNDONUM];
+};
+
+#define MAX_RAD_SELITEM 255
+struct MDIRADINFO{
+ //Radツール用
+
+ HWND hTools;
+
+ HWND hProperty;
+ HWND hProp_Dlg;
+
+ HWND hSupport;
+
+ HWND hRad;
+
+ HBITMAP hBitmap;
+ HBITMAP hOldBitmap;
+ HDC hMemDC;
+ int SelectingItem[MAX_RAD_SELITEM];
+ int ButtonSelect;
+
+ //ウィンドウクライアント領域
+ POINT ClientPos;
+ SIZE ClientSize;
+
+ //変更情報
+ RAD_UNDOSTATE undo;
+};
+
+struct MDIMENUINFO{
+ HWND hList;
+ HWND hMenuEdit;
+ HWND hEdit_Dlg;
+};
+
+#define ICONTYPE_16_16 0
+#define ICONTYPE_16_256 1
+#define ICONTYPE_32_16 2
+#define ICONTYPE_32_256 3
+struct ICONEDIT_UNDOSTATE{
+ int NowPos;
+ BYTE *lpData[MAX_ICONEDIT_UNDONUM];
+};
+struct MDIICONEDITINFO{
+ HWND hMain;
+ HWND hToolDlg;
+ HWND hButtonsDlg;
+ HWND hColorDlg;
+
+ HDC memdc;
+ HBITMAP hMemBmp;
+
+ HBITMAP hSelectingBmp;
+ int SelectLevel;
+ RECT DraggingRect;
+
+ int num;
+ int SelectIconNum;
+ union{
+ BYTE *pIconImage[8]; //アイコンのイメージデータ配列(マップ配列、カラー配列、マスク配列)
+ BITMAPINFOHEADER *pBmpHdr[8];
+ };
+ DWORD dwBytesInRes[8];
+
+ DWORD NowTool;
+ COLORREF MainColor;
+ COLORREF SubColor;
+
+ ICONEDIT_UNDOSTATE undo[8];
+ BOOL bModify;
+};
+
+struct MDITEXTEDITINFO{
+ HWND hEdit;
+
+ //Web検索ウィンドウ
+ CWebResult *pobj_WebResult;
+
+ //ルーラーウィンドウ
+ CRuler *pobj_Ruler;
+
+ //アイコン
+ HICON hIcon;
+
+ char *buffer;
+ COLORREF *pColorRef;
+ int iUnderStart;
+ int iUnderEnd;
+
+ POINT StartCaretPos;
+ POINT EndCaretPos;
+ int Temp_UpDown_CaretXPos;
+ BOOL bAutoScroll;
+
+ //コントロールタブスペースの幅と行番号の文字数
+ int iWidth_ControlTabSpace;
+ int iLineNumberTextCount;
+
+ int iCharCode;
+ int iLfCode;
+
+ BOOL bModify;
+};
+
+struct MDIINFO{
+ HWND hwnd;
+ int DocType;
+ char *title;
+ char *path;
+
+ union{
+ MDIRADINFO *MdiRadInfo;
+ MDIMENUINFO *MdiMenuInfo;
+ MDIICONEDITINFO *MdiIconEditInfo;
+ MDITEXTEDITINFO *pmti;
+ };
+
+ char *IndentStr;
+ TEXTEDIT_UNDOSTATE *edit_undo;
+};
+extern MDIINFO MdiInfo[MAX_WNDNUM];
+
+//RADツールのマウスドラッグ
+#define FRAME_CHANGEPOS_START 1 //----- ここから -----
+#define FRAME_UPPER_LEFT 1
+#define FRAME_UPPER_RIGHT 2
+#define FRAME_LOWER_LEFT 3
+#define FRAME_LOWER_RIGHT 4
+#define FRAME_LEFT 5
+#define FRAME_RIGHT 6
+#define FRAME_UPPER 7
+#define FRAME_LOWER 8
+#define FRAME_INSIDE 9
+#define FRAME_CHANGEPOS_END 9 //----- ここまで -----
+#define ITEM_MAKING 10
+#define SELECTING_FRAME 11
+
+//アイテムの大きさの限界値
+#define MIN_ITEM_X 12
+#define MIN_ITEM_Y 9
+
+//選択アイテム
+#define SELECT_WINDOW -1
+#define NON_TOOL -1
+
+struct RADINFO{
+ int NowDragging;
+ POINT DragStartPos;
+ RECT DragStartRect[MAX_RAD_SELITEM];
+ RECT DraggingRect[MAX_RAD_SELITEM];
+ RECT OldDraggingRect[MAX_RAD_SELITEM];
+};
+
+
+//////////////////
+//リソース情報
+struct RESITEMINFO{
+ char *IdName;
+ char *path;
+
+ HTREEITEM hTreeItem;
+};
+struct RESOURCEINFO{
+ int NumberOfCursorRes;
+ RESITEMINFO *pCursorResInfo;
+ HTREEITEM hCursorTreeItem;
+
+ int NumberOfBitmapRes;
+ RESITEMINFO *pBitmapResInfo;
+ HTREEITEM hBitmapTreeItem;
+
+ int NumberOfIconRes;
+ RESITEMINFO *pIconResInfo;
+ HTREEITEM hIconTreeItem;
+};
+
+
+////////////////////
+//プロジェクト情報
+
+#define PROJECT_VERSION 10
+
+class CFileInfo{
+public:
+ char *m_path;
+ HTREEITEM m_hTreeItem;
+ CFileInfo(char *path,HTREEITEM hTreeItem);
+ ~CFileInfo();
+
+ void GetFullPath(char *buffer);
+};
+class CDBFileInfo{
+public:
+ int iNum;
+ CFileInfo **ppobj_FileInfo;
+
+ CDBFileInfo();
+ ~CDBFileInfo();
+
+ void add(char *path,HTREEITEM hTreeItem);
+ void del(HTREEITEM hTreeItem);
+ char *GetPath(HTREEITEM hTreeItem);
+ BOOL IsMainFile(HTREEITEM hTreeItem);
+
+ void SetTreeItem(int index,HTREEITEM hTreeItem);
+ void ResetTree(void);
+
+ BOOL dupli_check(char *path);
+};
+struct FILEINFO{
+ char *pPath;
+ HTREEITEM hTreeItem;
+};
+
+struct PROCINFO{
+ char *name;
+ int FileNum;
+ HTREEITEM hTreeItem;
+
+ int code_pos;
+};
+struct INCPROCINFO{
+ char *name;
+ char *Parms;
+ char *type;
+};
+
+//ダイアログアイテムの種類
+#define CT_BUTTON 1
+#define CT_CHECKBOX 2
+#define CT_COMBOBOX 3
+#define CT_EDIT 4
+#define CT_GROUPBOX 5
+#define CT_HSCROLLBAR 6
+#define CT_IMAGEBOX 7
+#define CT_LISTBOX 8
+#define CT_LISTVIEW 9
+#define CT_RADIOBUTTON 10
+#define CT_STATIC 11
+#define CT_TREEVIEW 12
+#define CT_VSCROLLBAR 13
+#define CT_UPDOWN 14
+#define CT_PROGRESSBAR 15
+#define CT_TRACKBAR 16
+#define CT_MENU 99
+
+//イベント タイプ
+#define EVENTTYPE_DEFAULT 0
+#define EVENTTYPE_MENU 1
+#define EVENTTYPE_MMSYS 2
+
+//ウィンドウ タイプ
+#define WNDTYPE_DEFAULT 0
+#define WNDTYPE_MODALDLG 1
+#define WNDTYPE_MODELESSDLG 3
+
+//イメージタイプ
+#define IMGTYPE_FILE 0
+#define IMGTYPE_RES 1
+
+struct IMAGECTRLINFO{
+ int type;
+ char *path;
+};
+struct CHILDINFO{
+ char *IdName;
+ POINT pos;
+ SIZE size;
+ char *caption;
+ DWORD style;
+ DWORD ExStyle;
+ int Control;
+
+ IMAGECTRLINFO ImageCtrlInfo;
+};
+struct WINDOW_INFO{
+ //ウィンドウデータ
+ char *name;
+ char *HandleName;
+ POINT pos;
+ SIZE size;
+ char *caption;
+ DWORD style;
+ DWORD ExStyle;
+ char *MenuID;
+ int id;
+ int bgColor;
+ LOGFONT LogFont;
+ char *IconResName;
+ char *ClassName;
+ char *CallBackName;
+ long type;
+ char *filepath;
+
+ //子ウィンドウ管理
+ int NumberOfChildWindows;
+ CHILDINFO *pChildInfo;
+
+ //ツリー項目
+ HTREEITEM hTreeItem;
+};
+struct NEWPROJECTINFO{
+ char name[MAX_PATH];
+ DWORD dwTypeID;
+ _int8 ShowHelloWorld;
+ DWORD dwOption;
+};
+struct MENU_INFO{
+ char *IdName;
+ char *caption;
+ UINT type;
+ UINT state;
+
+ int NumberOfMenu;
+ MENU_INFO *pMenuInfo;
+
+ HTREEITEM hTreeItem;
+};
+#define MT_EXE 0 //EXEモジュールタイプ
+#define MT_DLL 1 //DLLモジュールタイプ
+#define PJ_OP_SOURCE_MASK 0x00FFFFFF
+#define PJ_OP_MMSYSTEM 0x00000001
+#define PJ_OP_COMMCTRL 0x00000002
+#define PJ_OP_RICHEDIT 0x00000004
+#define PJ_OP_WINSOCK 0x00000008
+#define PJ_OP_STRICT 0x00010000
+#define PJ_OP_RC_MANIFEST 0x00020000
+struct PROJECTINFO{
+ DWORD dwModuleType;
+
+ char name[MAX_PATH];
+ char dir[MAX_PATH];
+
+ DWORD dwVersion;
+
+ CDBFileInfo *pobj_DBFileInfo;
+
+ char ResourceFileName[MAX_PATH];
+
+ int NumberOfMenu;
+ MENU_INFO *pMenuInfo;
+ HTREEITEM hMenuTreeItem;
+
+ int NumberOfWindows;
+ WINDOW_INFO *pWindowInfo;
+ HTREEITEM hWindowTreeItem;
+
+ RESOURCEINFO res;
+
+ DWORD dwOption;
+ char lpszOutput_Release[MAX_PATH];
+ char lpszOutput_Debug[MAX_PATH];
+
+ //マニフェスト
+ char szManifestPath[MAX_PATH];
+
+ //デバッグ情報
+ char szCmdLine[8192];
+ char szExePath[MAX_PATH];
+
+ //ブレークポイント情報
+ CDBBreakPoint *pobj_DBBreakPoint;
+
+ _int8 ModifyOfMaterial;
+ _int8 ModifuOfResource;
+ _int8 modify;
+};
+extern PROJECTINFO ProjectInfo;
+
+
+struct SAVEREBAR{
+ int RebarID;
+ int RebarLength;
+ int IsBandBreak;
+};
+
+struct ITEMEVENTINFO{
+ char *IdName;
+ char **pEventNames;
+ int ClassID;
+ int EventNum;
+};
+
+#define PARAMETER_HINT_MAX_SIZE 8192
+struct METHODCHECKINFO{
+ HWND hWnd;
+ LOGFONT LogFont;
+ HFONT hFont;
+ HFONT hBoldFont;
+ char BeforeMethodName[VN_SIZE];
+ char msg[PARAMETER_HINT_MAX_SIZE];
+ int ParmNum;
+ int HeadPos;
+};
+
+
+/////////////////////
+// コード補完機能
+/////////////////////
+
+#define ACCESS_NON 0
+#define ACCESS_PRIVATE 1
+#define ACCESS_PUBLIC 2
+#define ACCESS_PROTECTED 3
+#define ACCESS_PAIRCOMMAND 4
+#define ACCESS_HTML_GENERAL_PARAM 5
+#define ACCESS_HTML_PARAM 6
+struct MEMBERINFO{
+ //クラス名
+ char *pName;
+ DWORD dwProc;
+ DWORD dwAccess;
+
+ int code_pos;
+};
+struct COMPLEMENT_WINDOW_INFO{
+ HWND hWnd;
+ HWND hList;
+
+ int iPos;
+ int iLength;
+
+ MEMBERINFO *pMemberInfo;
+ int MemberNum;
+
+ //ペアステートメントのインデント格納用
+ char szIndent[255];
+};
+
+
+
+class CSettingFile{
+ BOOL GetDataLine(char *name,char *parms);
+protected:
+ char *buffer;
+
+ BOOL GetWholeValue(char *name,int *pi32data);
+ BOOL Get3WholeValue(char *name,int *pd1,int *pd2,int *pd3);
+ BOOL GetRGBValue(char *name,COLORREF *prgb);
+ BOOL GetStringValue(char *name,char *str);
+ BOOL GetRectValue(char *name,RECT *prc);
+ BOOL GetLogFont(char *name,LOGFONT *plf);
+ BOOL GetRebarBand(SAVEREBAR *psr,int num);
+
+ void SetWholeValue(char *name,long i32data);
+ void Set3WholeValue(char *name,long d1,long d2,long d3);
+ void SetRGBValue(char *name,COLORREF rgb);
+ void SetStringValue(char *name,char *str);
+ void SetRectValue(char *name,RECT *prc);
+ void SetLogFont(char *name,LOGFONT *plf);
+ void SetRebarBand(SAVEREBAR *psr,int num);
+};
+#include "DesignTheme.h"
+
+
+
+//ProjectEditor.cpp
+void HeapDefaultFree(LPVOID lpMem);
+void ToBigChar(char str[]);
+int GetWndNum(HWND hChild);
+int GetNowWndNum(void);
+int GetFileNum(int WndNum);
+void SendTextEditResizeEvent(HWND hwnd);
+void RedrawAllWindow(void);
+int DocumentModifyCheck(HWND hChild);
+void SetStatusText(char *MenuText);
+void ResetState_UndoMenu(void);
+void ResetState_EditMenu(void);
+void ResetState_DocMenu(void);
+void DuplicateTitleCheck(char *lpszTitle);
+HWND NewTextEditWindow(char *filepath,_int8 DocumentType,COLORREF TabColor=TABCOLOR_GRAY);
+void CloseDocWindow(int WndNum);
+void ResizeTextEditWnd(HWND hwnd,int cx,int cy);
+void ResizeOwnerWnd(void);
+#define FLAG_DBLCLK 1
+#define FLAG_BEAMCURSOR 2
+int RegWndClass(WNDPROC WndProc,char *lpClassName,HBRUSH hBackBrush,DWORD dwFlag);
+
+//Backup.cpp
+void CreateBackupDir(void);
+void backup(void *dummy);
+BOOL restore(void);
+
+//DialogBoxes.cpp
+void SetPosCenter(HWND hParent,HWND hwnd);
+void SetPosCenter(HWND hwnd);
+BOOL SetFontDialog(HWND hwnd,LOGFONT *lf,BOOL bFixedPitchOnly,int *lpiPointSize=0);
+void DlgNewProjectWizard(HWND hwnd);
+BOOL CALLBACK DlgNewFile(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void DlgProjectOptionSetting(HWND hwnd);
+void DlgOptionSetting(HWND hwnd);
+BOOL CALLBACK DialogAbout(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK DlgPassword(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK DlgProfessionalStart(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//FileOperation.cpp
+void MakeUserSettingDir(void);
+char *ReadBuffer(char *path);
+char *ReadBuffer_NonErrMsg(char *path);
+_int8 WriteBuffer(char *path,char *buffer,int length);
+_int8 WriteBuffer_NonErrMsg(char *path,char *buffer,int length);
+void GetRelationalPath(char *path,char *dir);
+void GetFullPath(char *path,char *dir);
+void RemoveDirectoryStrong(char *dir_path);
+BOOL GetFilePathDialog(HWND hwnd,char *filename,LPSTR Filter,LPSTR Title,_int8 IsOpen);
+BOOL GetFolder(HWND hWnd,char *folder,char *OpenFolderTitle);
+int GetFileExtension(char *path);
+HWND OpenFileWithExtension(char *OpenFileName);
+BOOL SaveDocument(HWND hChild,char *SaveFileName);
+BOOL ShortPathToLongPath(char ShortPath[MAX_PATH],char *LongPath);
+BOOL IsFile(char *path);
+
+//rebar.cpp
+#define MAX_BAND 255
+typedef HWND (*AddBandProc)(HWND hRebar,int num,char *lpszText);
+class CDBRebarBand{
+ int BandId[MAX_BAND];
+ AddBandProc pAddProc[MAX_BAND];
+ int iMaxBandNum;
+public:
+ HWND hRebar;
+ CDBRebarBand();
+ ~CDBRebarBand();
+ void add(int band_id,AddBandProc add_proc);
+ HWND call_add(int band_id,int num,char *lpszText);
+};
+class CMainRebar{
+ CDBRebarBand *pobj_DBRebarBand;
+
+ void SetupRebar(HWND hwnd);
+public:
+ HWND hParent;
+ HWND hRebar;
+
+ CMainRebar(HWND hwnd_parent);
+ ~CMainRebar();
+
+ void ResetInitRebar();
+ void ResetRebar();
+ void SaveRebarState(void);
+ void ChangeRebarBand(int BandID);
+ void menu_popup(HWND hwnd,int PosX,int PosY);
+};
+extern CMainRebar *pobj_Rebar;
+void ResetRebarData(void);
+LRESULT CALLBACK DefaultToolbarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK DocComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK DebuggerToolbarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//SubOperation.cpp
+void ScreenToClient(HWND hwnd,RECT *pRect);
+void ClientToScreen(HWND hwnd,RECT *pRect);
+BOOL IsWow64(void);
+void URLEncode(LPSTR pszSrc);
+void Digit(int num,char *buffer);
+void RectNaturalFormat(RECT *ReadRect,RECT *CopyRect);
+void RectNaturalFormat(int *x1,int *y1,int *x2,int *y2);
+void KillSpaces(char *str1,char *str2);
+void RemoveStringQuotes(char *str);
+void SlideString(char *str,int slide);
+void SlideBuffer(char *buffer,int length,int slide);
+BOOL IsVariableTopChar(char c);
+BOOL IsVariableChar(char c);
+BOOL IsCommandBackDelimitation(char *buffer,int pos);
+BOOL IsCommandDelimitation(char *buffer,int p);
+char *ComparisonString(char *str1,char *str2,BOOL bBigSmall);
+int GetOneParameter(char *Parameter,int pos,char *retAns);
+int GetStringInPare(char *buffer,char *ReadBuffer);
+int GetStringInBracket(char *buffer,char *ReadBuffer);
+void JumpBlank(char *pBuf,int *piPos);
+BOOL CheckParenthesis(char *buffer);
+DWORD GetValue(char *value);
+BOOL IsManagementCommand(int ComNum);
+int IsBasicReservedWord(char *str);
+HBITMAP CreateGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2);
+HBITMAP CreateVertGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2);
+HBITMAP CreateHorzGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2);
+HICON CreateGrayIcon(HICON hBaseIcon);
+void GetSize(SIZE *pSize,RECT *pRect);
+BOOL HitTest(RECT *pRect,POINT *pPos);
+BOOL Rectangle(HDC hdc,RECT *pRect);
+void ComboBox_SetSelText(HWND hCombo,char *lpszText);
+void SetCursorByState(int state);
+void SetTextEditColorDesign(TEXTEDIT_COLOR_INFO *pColorInfo,CTheme *pobj_Theme,BOOL bRedraw);
+BOOL SerialCheck(char *buffer);
+void WriteSerialHash(void);
+BOOL SetupProjectEditor(void);
+void EndProjectEditor(void);
+void SetupWindow(HWND hwnd);
+BOOL SetRunning(HWND hChild);
+BOOL IsNeedCompile(char *FileName,BOOL bDebug);
+
+//DocumentAdvice.cpp
+void MenuAdvice(WPARAM msg);
+void ShowToolTipText(LPTOOLTIPTEXT TipText);
+char *IncludeFiles(char *buffer);
+void AddParameterHints_ToProject(char *path);
+
+
+
+/////////////////////
+// テキスト エディタ
+/////////////////////
+
+#define CONTROL_TAB_SPACE_DEFAULT 10 //エディタ画面左端のコントロールタブ(通常)
+
+//DrawBuffer.cpp
+void TextEdit_DrawBuffer(HDC hdc,int WndNum);
+
+//TextEditor.cpp
+int GetControlTabSpace(int WndNum,int *piCount=0);
+void ResetTextEditFont(HWND hwnd);
+void SetTextEditWordColor(int WndNum);
+BOOL IsHiragana(char *pBuf);
+BOOL IsAlphabet(char c);
+BOOL IsReturnCode(char *pBuf);
+void ResetScrollbar(int WndNum,int max_x,int max_y);
+#define WORDCARET_BEFORE 1
+#define WORDCARET_AFTER 2
+void TextEdit_GetWordCaret(HWND hwnd,int WndNum,POINT *pPos,int *piStart,int *piEnd,BOOL bBeforeAfterFlag);
+void CancelBeforeAutoIndent(int WndNum);
+LRESULT CALLBACK TextEditProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//Caret.cpp
+BOOL IsRightTurn(char *pBuf,int i,int now_x);
+int GetBufferIndexFromCaretPos(char *pBuf,int now_x,int now_y);
+void GetCaretPosFromBufferIndex(char *pBuf,int index,POINT *pCaretPos);
+void TextEdit_GetSel(int WndNum,CHARRANGE *pCharRange);
+void TextEdit_GetSelText(int WndNum,CHARRANGE *pCharRange,char *buffer);
+void GetScrollBaseCaretPos(int WndNum,int *pNaturalBaseX,int *pNaturalBaseY);
+void GetNaturalBaseCaretPos(int WndNum,int *pScrollBaseX,int *pScrollBaseY);
+void TextEdit_SetSel(int WndNum,int StartIndex,int EndIndex,BOOL bShowCenter=0);
+void TextEdit_SelectOneLine(int WndNum,int code_pos,BOOL bShowCenter=0);
+void ResetCaretPos(int WndNum,BOOL bInputAndReset=0);
+BOOL TextEdit_ScrollCaret(int WndNum,BOOL bScrollOneStep_x,BOOL bShowCenter=0);
+void CaretPos_LooseToNatural(int WndNum,int loose_x,int loose_y,POINT *pCaretPos);
+void GetNaturalCaretPos_Click(int WndNum,int mouse_x,int mouse_y,POINT *pCaretPos);
+void GetNaturalCaretPos_Left(int WndNum);
+void GetNaturalCaretPos_Right(int WndNum,POINT *pCaretPos);
+void GetNaturalCaretPos_Up(int WndNum,POINT *pCaretPos);
+void GetNaturalCaretPos_Down(int WndNum,POINT *pCaretPos);
+void GetNaturalCaretPos_PageUp(int WndNum,POINT *pCaretPos);
+void GetNaturalCaretPos_PageDown(int WndNum,POINT *pCaretPos);
+
+//Replace.cpp
+void TextEdit_Replace(int WndNum,char *str,BOOL bRedraw);
+void TextEdit_ReplaceUpdateUndoData(int WndNum,char *str,BOOL bPaste,BOOL bRedraw);
+void TextEdit_Convert(int id);
+
+//TextEditor_UndoRedo.cpp
+void TextEdit_UndoCommand(int WndNum);
+void TextEdit_RedoCommand(int WndNum);
+void TextEdit_NoticeChanging(int WndNum,int Command,char *KeyStr,char *DelStr,CHARRANGE *Range,CHARRANGE *DelRange);
+void TextEdit_DeleteUndoData(int WndNum,int pos);
+
+//Search.cpp
+void AddFindData(HWND hwnd,char ppData[MAX_FINDLIST][MAX_PATH],char *str);
+BOOL CALLBACK DlgFind(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK DlgPermutation(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//analysis.cpp
+BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,int *pRefType);
+BOOL CheckReferType(char *ClassName,BOOL bArray,char *VarArray,int VarRefType);
+void GetOriginalClassName(char *ClassName);
+int GetClassPos(char *pBuf,char *ClassName,DWORD *pdwClassType);
+BOOL GetClassNameFromClassMember(char *pBuf,int iPos,char *VarName,char *ClassName,BOOL *pbArray);
+void GetCodeAreaType(char *pBuf,int iPos,int *piProcPos,char *NowClass);
+BOOL GetVariableClassName(char *pEditBuf,int iPos,char *VarName,char *ClassName,BOOL *pbArray);
+
+//EndPairCommandComplement.cpp
+BOOL GetEndPairCommandInfo(char *buffer,int p);
+BOOL IsNeedNewIndentCommand(char *name);
+void GetWithObjectVariable(char *buffer,int p,char *pObjectVar);
+
+//Complement.cpp
+void DeleteComplementInfo(void);
+BOOL GetComplementInfo(char *variable,char *pEditBuf,int iPos);
+void CodeComplement(int WndNum,int iPos);
+LRESULT CALLBACK ComplementWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//ParameterHint.cpp
+char *GetUserSourceCode(void);
+void ChangeReturnCode(char *buffer);
+void DeleteComment(char *buffer);
+LRESULT CALLBACK MethodCheckWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void ShowParameterHint(int WndNum);
+
+//CodeFormatter.cpp
+char *CodeFormatter(char *lpszReadBuffer);
+
+#ifdef THETEXT
+//StringCount.cpp
+BOOL CALLBACK DlgStringCount(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+#endif
+
+//Print.cpp
+class CPage{
+public:
+ PAGESETUPDLG psd;
+ CPage();
+ ~CPage();
+
+ BOOL SetupDlg(void);
+};
+extern CPage obj_Page;
+LRESULT CALLBACK PreviewWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void Preview(void);
+void Printout(void);
+
+//History.cpp
+#define IS_FILEHISTORY_COMMAND(a) (100<=a&&a<=199)
+class CHistory{
+ int iNum;
+ int iMaxHistoryNum;
+
+ int m_BaseID;
+public:
+ char *lpszPath[255];
+
+ CHistory(int BaseID);
+ ~CHistory();
+
+ void load(char *path);
+ void save(char *path);
+
+ void add(char *path);
+ void insert(char *path);
+
+ void ResetFileMenu(CSubMenuEx *pobj_SubMenu,BOOL bOwnerDraw);
+};
+
+
+
+
+//////////////////////
+/* プロジェクト解析 */
+
+//CClassInfo.cpp
+class CClassInfo{
+public:
+ char ClassName[VN_SIZE];
+ MEMBERINFO *pMemberInfo;
+ int MemberNum;
+ CClassInfo();
+ ~CClassInfo();
+ int Analyze(char *pBuf,int *p);
+};
+
+//ClassTree.cpp
+struct TREEHASH{
+ HTREEITEM hItem;
+ int iFileNum;
+ TREEHASH *pNextData;
+};
+#define CTV_ROOT 1 //ルート
+#define CTV_FOLDER 2 //フォルダ
+#define CTV_GLOBAL_PROC 3 //プロシージャ
+#define CTV_CLASS 4 //クラス
+#define CTV_PUBLIC_MEMBER 5 //公開cメンバ変数
+#define CTV_PUBLIC_METHOD 6 //公開メソッド
+#define CTV_PRIVATE_MEMBER 7 //非公開メンバ変数
+#define CTV_PRIVATE_METHOD 8 //非公開メソッド
+class CClassTreeView{
+ HWND hTreeWnd;
+ int iNowFile;
+ TREEHASH tree_data[MAX_HASH];
+
+ HTREEITEM hGlobalProcedureFolder;
+ HTREEITEM hNowClassFolder;
+
+ int hash_default(LONG_PTR lpdata);
+
+ void AddValidItem(HTREEITEM hItem,int iFileNum);
+ BOOL delete_check(HTREEITEM hItem);
+ void DeleteInvalidItems(HTREEITEM hItem);
+ void DeleteTreeHash(TREEHASH *pth);
+
+ HTREEITEM insert(HTREEITEM hParentItem,int flag,char *lpszName,int iFileNum);
+
+public:
+ HTREEITEM hRootFolder;
+
+ int NumberOfProcedures;
+ PROCINFO *pProcInfo;
+
+ BOOL bCloseSwitch;
+ BOOL bShowSwitch;
+
+ CClassTreeView();
+ ~CClassTreeView();
+ void init(HWND hwnd,int iFileNum);
+
+ void InsertRootFolder(void);
+ void InsertGlobalProcedureFolder(void);
+ HTREEITEM InsertGlobalProcedure(int flag,char *lpszName,int iFileNum);
+ HTREEITEM insert_code_item(HTREEITEM hParentItem,int flag,char *lpszName,int iFileNum,char *pBuf,int p);
+ void InsertClassFolder(char *lpszName,int iFileNum,char *pBuf,int p);
+ void InsertClassMember(int flag,char *lpszName,int iFileNum,char *pBuf,int p);
+ void finish();
+};
+extern CClassTreeView *pobj_ClassTreeView;
+void ResetClassTree(int iFileNum);
+
+//ProjectControl.cpp
+void ResizeProjectView_ToolWindow(void);
+LRESULT CALLBACK ProjectView_ToolWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK ProjectViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void Project_File_Insert(char *path);
+void Project_File_Delete(HTREEITEM hTreeItem);
+void MakeNewProject(void);
+void OpenProject(char *path);
+BOOL ProjectModifyCheck(BOOL bRun);
+_int8 CloseProject(void);
+void MakeWorkFile(void);
+void SaveProject(void);
+BOOL SetProjectToRun(void);
+BOOL IsNeedCompileForProject(BOOL bDebug);
+
+//WindowControl.cpp
+int GetWndInfoNum(char *name);
+HGLOBAL Rad_GetChildInfoClipboardData(int WndNum,int WndInfoNum);
+void Rad_PasteChildInfoClipboardData(int WndNum,HGLOBAL hGlobal);
+char *PermutationWndPgmTemplate(char *pBuf,char *pPjName, char *pWndName, char *pHandleName, char *pProcName);
+void GetItemClassName(char *buffer,int Control);
+void SaveWindowProgram();
+void SaveWindowFile(char *path,WINDOW_INFO *WindowInfo,int NumberOfWindowInfo);
+_int8 OpenWindowFile(char *path);
+void GetDefaultWindowFont(LOGFONT *LogFont);
+void Project_Window_Insert(void);
+void Project_Window_Delete(int WndInfoNum);
+
+//Resource.cpp
+void GetResourceData(void);
+void Project_CursorResInsert(void);
+void Project_Cursor_Delete(int CursorInfoNum);
+void Project_Cursor_RenameID(int CursorInfoNum);
+void Project_BitmapResInsert(void);
+void Project_Bitmap_Delete(int IconInfoNum);
+void Project_Bitmap_RenameID(int BitmapInfoNum);
+void Project_IconResInsert(void);
+void Project_Icon_Delete(int IconInfoNum);
+void Project_Icon_RenameID(int IconInfoNum);
+BOOL CALLBACK DlgProject_ResourceID_Input(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+
+
+///////////////////
+/* RADウィンドウ */
+
+//RadProc.cpp
+void NewRadWindow(int WndInfoNum);
+int InsertDlgItem(int WndNum,int WndInfoNum,int ItemNum,POINT *pPos,SIZE *pSize,char *IdName,char *caption,DWORD style_or_WndNum,DWORD ExStyle,int Control,int ImageType,char *ImagePath,DWORD dwInsertType);
+void DeleteDlgItem(int WndNum,int WndInfoNum,int ItemNum,BOOL bNoticeChanging);
+void CursorPos_GlobalToLocal(HWND hwnd,long *x,long *y);
+void DrawSelectingRect(HWND hwnd,int WndNum,int WndInfoNum,int ButtonSelect);
+void ChangePropertyWindow(int WndNum,int WndInfoNum);
+void ResetScrollbarOfRadEditor(int WndNum,int weight,int height);
+LRESULT CALLBACK RadWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void ResizeToRadToolWindows(int WndNum,int weight,int height);
+LRESULT CALLBACK MDIClientWindow_Rad(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//DrawWindow.cpp
+void DrawRadWindow(int WndNum,WINDOW_INFO *pWindowInfo);
+
+//Rad_UndoRedo.cpp
+void Rad_UndoCommand(int WndNum);
+void Rad_RedoCommand(int WndNum);
+void Rad_DeleteUndoData(int WndNum,int pos);
+void Rad_NoticeChanging(int WndNum,int Command,int SelectItemNum,DWORD dwData);
+
+//RadToolsAndPropertyProc.cpp
+LRESULT CALLBACK RadToolsWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_WindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK DlgRadProperty_Item_RenameCaption(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ButtonProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_CheckBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ComboBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_EditProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_GroupBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ImageBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ListBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ListViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ProgressBarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_RadioButtonProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ScrollBarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_StaticProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_TrackBarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_TreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_UpDownProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK RadPropertyWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//MessageCallOperation.cpp
+char **GetProcedureNamesOfMessageCall(int WndInfoNum,ITEMEVENTINFO **ppItemEventInfo,int *num,BOOL *pbAlways);
+void SelectProcedureOfMessageCall(int WndInfoNum,char *ProcedureName,char *Parameter);
+BOOL CALLBACK DlgEventCode(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//RadSupport.cpp
+LRESULT CALLBACK TestWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void SetSupportDlgData(int WndNum,int WndInfoNum);
+BOOL CALLBACK DlgRadSupport(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+
+
+////////////////////
+/* MENUウィンドウ */
+
+//MenuProc.cpp
+int GetMenuInfoNum(char *name);
+void HeapMenuDataFree(MENU_INFO *pMenuInfo,int ItemNum,int *NumberOfFreedItem);
+BOOL CALLBACK DlgProject_MenuID_Input(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void Project_Menu_Insert(void);
+void Project_Menu_Delete(int MenuInfoNum);
+void NewMenuWindow(MENU_INFO *pMenuInfo);
+BOOL CALLBACK MenuEditDlg(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK MenuEditWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK MDIClientWindow_Menu(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+
+
+//////////////////////////////////
+/* アイコン エディタ ウィンドウ */
+
+//IconEditor.cpp
+void AddIconType(int WndNum,int IconType);
+void DeleteIconType(int WndNum);
+void NewIconEditWindow(char *filepath);
+void SaveIconFile(char *filepath,HWND hwnd);
+LRESULT CALLBACK MDIClientWindow_IconEdit(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//IconEditor_Main.cpp
+HGLOBAL IconEdit_GetChildInfoClipboardData(int WndNum);
+void IconEdit_PasteChildInfoClipboardData(int WndNum,HBITMAP hBmp);
+void IconEdit_PasteImage(int WndNum);
+void DrawIconToMemBmp(int WndNum,RECT *pRect);
+void IconEdit_EraseRect(int WndNum,RECT *pRect);
+LRESULT CALLBACK IconEditWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//IconEditor_Tool.cpp
+BOOL CALLBACK DlgIconButtons(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK DlgIconToolProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//IconEditor_Color.cpp
+BOOL CALLBACK DlgIconColorProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//IconEditor_UndoRedo.cpp
+void IconEdit_UndoCommand(int WndNum);
+void IconEdit_RedoCommand(int WndNum);
+void IconEdit_NoticeChanging(int WndNum);
+
+
+
+
+
+#include "NonVolatile.h"
+
+
+
+
+#ifdef _DEBUG
+/*Debug*/
+
+#define HeapAlloc CheckHeapAlloc
+#define HeapReAlloc CheckHeapReAlloc
+LPVOID CheckHeapAlloc(HANDLE hHeap,DWORD dwFlags,DWORD dwBytes);
+LPVOID CheckHeapReAlloc(HANDLE hHeap,DWORD dwFlags,LPVOID lpMem,DWORD dwBytes);
+
+#define DeleteObject CheckDeleteObject
+BOOL CheckDeleteObject(HGDIOBJ hObject);
+
+#endif
Index: /ProjectEditor/Complement.cpp
===================================================================
--- /ProjectEditor/Complement.cpp (revision 3)
+++ /ProjectEditor/Complement.cpp (revision 3)
@@ -0,0 +1,785 @@
+#include "common.h"
+
+///////////////////////////
+// コード補完機能
+///////////////////////////
+
+BOOL GetComplementClass(char *pBuf,char *ClassName,char *nest,BOOL bInherits){
+ extern HANDLE hHeap;
+ extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+ extern char *pHeaderBuf;
+ extern char *pUserSource;
+ int i,i2;
+ char temporary[8192];
+ DWORD dwClassType;
+ BOOL bRet;
+
+
+ /////////////////////////////////////////
+ // ソースコードからクラス定義位置を取得
+ /////////////////////////////////////////
+ i=GetClassPos(pBuf,ClassName,&dwClassType);
+ if(pBuf[i]=='\0') return 0;
+
+
+ if(nest[0]){
+ ////////////////////
+ // 入れ子構造の場合
+ ////////////////////
+
+ //クラス、配列の構成要素を解析する
+ char VarName[VN_SIZE]; //変数名
+ char array[VN_SIZE]; //第1次配列
+ char lpPtrOffset[VN_SIZE]; //第2次配列
+ char NestMember[VN_SIZE]; //入れ子メンバ
+ int RefType; //"."参照のときは0、"->"参照のときは1
+ lstrcpy(VarName,nest);
+ if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
+
+ //メンバ変数の型であるクラスの名前を取得
+ char ClassName[VN_SIZE];
+ BOOL bArray;
+ if(!GetClassNameFromClassMember(pBuf,i,VarName,ClassName,&bArray)) return 0;
+
+ //TypeDef宣言を考慮してオリジナルなクラス名を取得
+ GetOriginalClassName(ClassName);
+
+ if(!CheckReferType(ClassName,bArray,array,RefType)) return 0;
+
+ //ユーザーのソースコードをサーチ
+ bRet=GetComplementClass(pUserSource,ClassName,NestMember,0);
+ if(!bRet){
+ //失敗したときはbasic.sbpをサーチ
+ bRet=GetComplementClass(pHeaderBuf,ClassName,NestMember,0);
+ }
+ return bRet;
+ }
+
+
+ ////////////////////////
+ // メンバ情報を取得
+ ////////////////////////
+ DWORD dwAccess;
+ DWORD dwProc;
+
+ //アクセス制限の初期値をセット
+ if(dwClassType==ESC_CLASS) dwAccess=ACCESS_PRIVATE;
+ else dwAccess=ACCESS_PUBLIC;
+
+ if(memicmp(pBuf+i,"Inherits",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')){
+ i+=9;
+ while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+ //継承を行う場合
+ for(i2=0;;i++,i2++){
+ if(!IsVariableChar(pBuf[i])){
+ temporary[i2]=0;
+ break;
+ }
+ temporary[i2]=pBuf[i];
+ }
+
+ //ユーザーのソースコードをサーチ
+ bRet=GetComplementClass(pUserSource,temporary,"",1);
+ if(!bRet){
+ //失敗したときはbasic.sbpをサーチ
+ bRet=GetComplementClass(pHeaderBuf,temporary,"",1);
+ }
+
+ for(;;i++){
+ if(pBuf[i]=='\0') break;
+ i2=IsCommandDelimitation(pBuf,i);
+ if(i2){
+ i+=i2;
+ break;
+ }
+ }
+ JumpBlank(pBuf,&i);
+ }
+
+ //メンバ変数、関数を取得
+ while(1){
+ if(pBuf[i]=='\0') break;
+ if(memicmp(pBuf+i,"End",3)==0){
+ /* End Class
+ End Type
+ の検出 */
+ i2=i+3;
+ while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+
+ if(memicmp(pBuf+i2,"Class",5)==0&&(!IsVariableChar(pBuf[i2+5]))||
+ memicmp(pBuf+i2,"Interface",9)==0&&(!IsVariableChar(pBuf[i2+9]))||
+ memicmp(pBuf+i2,"Type",4)==0&&(!IsVariableChar(pBuf[i2+4]))) break;
+ }
+
+ if(memicmp(pBuf+i,"Abstract",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+ memicmp(pBuf+i,"Virtual",7)==0&&(pBuf[i+7]==' '||pBuf[i+7]=='\t')||
+ memicmp(pBuf+i,"Override",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+ memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+ memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
+ //メンバ関数のとき
+ if(pBuf[i]=='a'||pBuf[i]=='A'){
+ i+=9;
+ dwProc=ESC_ABSTRACT;
+
+ while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+ if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
+ else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
+ }
+ else if(pBuf[i]=='v'||pBuf[i]=='V'){
+ i+=8;
+ dwProc=ESC_VIRTUAL;
+
+ while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+ if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
+ else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
+ }
+ else if(pBuf[i]=='o'||pBuf[i]=='O'){
+ i+=9;
+ dwProc=ESC_OVERRIDE;
+
+ while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+ if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
+ else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
+ }
+ else if(pBuf[i]=='f'||pBuf[i]=='F'){
+ i+=9;
+ dwProc=ESC_FUNCTION;
+ }
+ else if(pBuf[i]=='s'||pBuf[i]=='S'){
+ i+=4;
+ dwProc=ESC_SUB;
+ }
+
+ while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+ }
+ else{
+ //メンバ変数のとき
+ dwProc=0;
+ }
+
+ //変数名または関数名を取得
+ if(pBuf[i]=='~'){
+ temporary[0]='~';
+ i2=1;
+ i++;
+ }
+ else i2=0;
+ for(;;i++,i2++){
+ if(!IsVariableChar(pBuf[i])){
+ temporary[i2]=0;
+ break;
+ }
+ temporary[i2]=pBuf[i];
+ }
+
+ if(bInherits){
+ //継承元の場合はコンストラクタ、デストラクタを除去
+ if(temporary[0]=='~') goto next;
+ if(lstrcmp(temporary,ClassName)==0) goto next;
+ }
+
+ //次の行をサーチ
+ for(;;i++){
+ if(pBuf[i]=='\0') break;
+ if(pBuf[i]=='\''||(pBuf[i]=='/'&&pBuf[i+1]=='*')){
+ //コメント中
+ JumpBlank(pBuf,&i);
+ break;
+ }
+ i2=IsCommandDelimitation(pBuf,i);
+ if(i2){
+ i+=i2;
+ break;
+ }
+ }
+ JumpBlank(pBuf,&i);
+
+ //重複チェック(オーバーライド関数の除去)
+ for(i2=0;i2"参照のときは1
+ lstrcpy(VarName,variable);
+ if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)){
+ HeapDefaultFree(pUserSource);
+ pUserSource=0;
+ return 0;
+ }
+
+
+ ////////////////////////////////
+ // オブジェクトのクラス名を取得
+ ////////////////////////////////
+ char ClassName[VN_SIZE];
+ BOOL bArray;
+ if(!GetVariableClassName(pEditBuf,iPos,VarName,ClassName,&bArray)){
+ HeapDefaultFree(pUserSource);
+ pUserSource=0;
+ return 0;
+ }
+
+ //TypeDef宣言を考慮してオリジナルなクラス名を取得
+ GetOriginalClassName(ClassName);
+
+ if(!CheckReferType(ClassName,bArray,array,RefType)){
+ HeapDefaultFree(pUserSource);
+ pUserSource=0;
+ return 0;
+ }
+
+
+ ////////////////////
+ // クラス情報を取得
+ ////////////////////
+ extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+
+ ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,1);
+ ComplementWndInfo.MemberNum=0;
+
+ //ユーザーのソースコードをサーチ
+ BOOL bRet;
+ bRet=GetComplementClass(pUserSource,ClassName,NestMember,0);
+ if(!bRet){
+ //失敗したときはbasic.sbpをサーチ
+ extern char *pHeaderBuf;
+ bRet=GetComplementClass(pHeaderBuf,ClassName,NestMember,0);
+ }
+
+ HeapDefaultFree(pUserSource);
+ pUserSource=0;
+
+ if(!bRet||ComplementWndInfo.MemberNum==0){
+ //見つからなかったとき
+ DeleteComplementInfo();
+ return 0;
+ }
+
+ return 1;
+}
+void CodeComplement(int WndNum,int iPos){
+ int i,i2;
+
+ //エディタ画面左端のコントロールタブ
+ int iControlTabSpace;
+ iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ extern int font_width,font_height;
+ POINT pos;
+ pos=MdiInfo[WndNum].pmti->StartCaretPos;
+ GetScrollBaseCaretPos(WndNum,(int *)&pos.x,(int *)&pos.y);
+
+ pos.x=(pos.x-1)*font_width +iControlTabSpace;
+ pos.y=(pos.y+1)*font_height;
+
+ ClientToScreen(MdiInfo[WndNum].pmti->hEdit,&pos);
+
+ extern HINSTANCE hInst;
+ extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+ ComplementWndInfo.hWnd=CreateWindowEx(WS_EX_DLGMODALFRAME,
+ "ComplementWindow",NULL,
+ WS_POPUP|WS_CLIPCHILDREN,
+ pos.x,pos.y,100,100,
+ hOwner,NULL,hInst,0);
+
+ ///////////////////////////
+ // リストビューの初期化
+ ///////////////////////////
+ extern METHODCHECKINFO MethodCheckInfo;
+ int height,max_width,listitem_height;
+ max_width=0;
+
+ // リストアイテムを追加
+ LV_ITEM lvItem;
+ lvItem.mask = LVIF_TEXT|LVIF_IMAGE;
+ for(i=0;ilistitem_height*MAX_COMPLEMENT_LISTNUM+dy){
+ size.cy=listitem_height*MAX_COMPLEMENT_LISTNUM+dy;
+
+ //垂直スクロールバーの幅を考慮する
+ size.cx+=GetSystemMetrics(SM_CXVSCROLL);
+ }
+ else{
+ //スクロールバーを使用しないようにする
+ i=GetWindowLong(ComplementWndInfo.hList,GWL_STYLE);
+ i|=LVS_NOSCROLL;
+ i&=~(WS_VSCROLL|WS_HSCROLL);
+ SetWindowLong(ComplementWndInfo.hList,GWL_STYLE,i);
+ }
+
+ if(pos.x+size.cx>ScreenX){
+ pos.x=ScreenX-size.cx;
+ }
+ if(pos.y+size.cy>ScreenY-30){
+ pos.y-=size.cy+font_height;
+ }
+
+ //サイズ変更
+ MoveWindow(ComplementWndInfo.hWnd,
+ pos.x,pos.y,
+ size.cx,size.cy,0);
+
+ //チラツキを抑えながら、補完リストを表示する
+ ShowWindow(ComplementWndInfo.hWnd,SW_SHOWNOACTIVATE);
+
+ ComplementWndInfo.iPos=iPos;
+}
+
+
+
+////////////////////////////////
+// コード補完ウィンドウ
+////////////////////////////////
+
+void DrawComplementListView(HWND hListView,HDC hdc){
+ //コード補完リストビューの独自描画
+ int i;
+ RECT rc;
+ char temporary[1024];
+
+ RECT rcClient;
+ GetClientRect(hListView,&rcClient);
+
+ HFONT hFont;
+ hFont=(HFONT)SendMessage(hListView,WM_GETFONT,0,0);
+
+ HFONT hOldFont;
+ hOldFont=(HFONT)SelectObject(hdc,hFont);
+
+ SetBkMode(hdc,OPAQUE);
+
+ for(i=0;ihEdit);
+ return 0;
+ case WM_KEYDOWN:
+ if(LOWORD(wParam)==VK_RETURN) goto DblClk;
+ else if(LOWORD(wParam)==VK_ESCAPE){
+ DestroyWindow(ComplementWndInfo.hWnd);
+ ComplementWndInfo.hWnd=0;
+ }
+ break;
+ case WM_LBUTTONDOWN:
+ //フォーカスをエディタに戻す
+ WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+ SetFocus(MdiInfo[WndNum].pmti->hEdit);
+
+ LVHITTESTINFO lvHitTest;
+ lvHitTest.pt.x=0;
+ lvHitTest.pt.y=HIWORD(lParam);
+ ListView_HitTest(hwnd,&lvHitTest);
+
+ //アイテムを選択
+ ListView_SetItemState(hwnd,lvHitTest.iItem,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
+ return 0;
+ case WM_LBUTTONDBLCLK:
+DblClk:
+
+ //選択されたアイテムを取得
+ for(i=0;ibuffer[i]!='\t'){
+ i++;
+ break;
+ }
+ }
+
+ GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
+ i,
+ &MdiInfo[WndNum].pmti->StartCaretPos);
+
+ //インデント
+ lstrcpy(temp2,ComplementWndInfo.szIndent);
+ if(IsNeedNewIndentCommand(temporary)) lstrcat(temp2,"\t");
+
+ lstrcat(temp2,temporary);
+
+ //リプレース前に補完機能を破棄する
+ DestroyWindow(ComplementWndInfo.hWnd);
+ ComplementWndInfo.hWnd=0;
+
+ TextEdit_ReplaceUpdateUndoData(WndNum,temp2,0,1);
+ }
+ else{
+ //クラスメンバ補完
+
+ GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,
+ ComplementWndInfo.iPos,
+ &MdiInfo[WndNum].pmti->StartCaretPos);
+
+ //リプレース前に補完機能を破棄する
+ DestroyWindow(ComplementWndInfo.hWnd);
+ ComplementWndInfo.hWnd=0;
+
+ TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1);
+ }
+ }
+
+ return 0;
+
+ case WM_PAINT:
+ HDC hdc;
+ PAINTSTRUCT ps;
+ hdc=BeginPaint(hwnd,&ps);
+ DrawComplementListView(hwnd,hdc);
+ EndPaint(hwnd,&ps);
+ return 0;
+ }
+ return CallWindowProc(OldComplementListViewProc,hwnd,message,wParam,lParam);
+}
+
+LRESULT CALLBACK ComplementWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+ static HWND hListView;
+ static HIMAGELIST hImageList;
+
+ switch(message){
+ case WM_CREATE:
+
+ ////////////////////////
+ // リストビューを作成
+ ////////////////////////
+
+ hListView=CreateWindow(WC_LISTVIEW,0,
+ WS_CHILD|WS_VISIBLE|WS_VSCROLL| LVS_SMALLICON|LVS_SINGLESEL|LVS_SORTASCENDING|LVS_SHOWSELALWAYS,
+ 0,0,0,0,
+ hwnd,NULL,hInst,0);
+ OldComplementListViewProc=(WNDPROC)GetWindowLongPtr(hListView,GWLP_WNDPROC);
+ SetWindowLong(hListView,GWLP_WNDPROC,(long)ComplementListViewProc);
+
+ //フォントをセット
+ extern METHODCHECKINFO MethodCheckInfo;
+ SendMessage(hListView,WM_SETFONT,(long)MethodCheckInfo.hFont,0);
+
+ ComplementWndInfo.hList=hListView;
+
+ //背景色をセット
+ COLORREF rgb;
+ if(ComplementWndInfo.pMemberInfo[0].dwAccess==ACCESS_PAIRCOMMAND){
+ //ペアステートメント補完
+ rgb=RGB(245,245,255);
+ }
+ else{
+ //クラスメンバ補完
+ rgb=RGB(255,245,240);
+ }
+ ListView_SetBkColor(hListView,rgb);
+ ListView_SetTextBkColor(hListView,rgb);
+
+
+ ////////////////////////
+ // イメージリストを作成
+ ////////////////////////
+
+ hImageList=ImageList_Create(16, 16, ILC_COLOR24, 7, 0);
+ ListView_SetImageList(hListView, hImageList, LVSIL_SMALL);
+ ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_MEMBER_PRIVATE_VARIABLE)));
+ ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_MEMBER_PUBLIC_VARIABLE)));
+ ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_MEMBER_PRIVATE_FUNCTION)));
+ ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_MEMBER_PUBLIC_FUNCTION)));
+ ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_PAIRSTATEMENT)));
+ ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_HTML_GENERAL_PARAMETER)));
+ ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_HTML_PARAMETER)));
+
+ return 0;
+ case WM_SIZE:
+ MoveWindow(hListView,0,0,LOWORD(lParam),HIWORD(lParam),0);
+ return 0;
+ case WM_DESTROY:
+ DeleteComplementInfo();
+ ImageList_Destroy(hImageList);
+ return 0;
+
+ case WM_NOTIFY:
+ NMLISTVIEW *nmListView;
+ nmListView=(NMLISTVIEW *)lParam;
+ if(nmListView->hdr.hwndFrom==hListView){
+ if(nmListView->hdr.code==LVN_ITEMCHANGED){
+ InvalidateRect(hListView,NULL,0);
+ return 1;
+ }
+ }
+ break;
+ }
+ return DefWindowProc(hwnd,message,wParam,lParam);
+}
Index: /ProjectEditor/Debugger.cpp
===================================================================
--- /ProjectEditor/Debugger.cpp (revision 3)
+++ /ProjectEditor/Debugger.cpp (revision 3)
@@ -0,0 +1,525 @@
+#ifndef THETEXT
+//ProjectEditorのみ
+
+#include "common.h"
+
+CDebugger *pobj_Debugger;
+
+#define WM_DEBUG_CONTINUE WM_USER+200
+#define WM_STEP_IN WM_USER+201
+#define WM_STEP_OVER WM_USER+202
+#define WM_STEP_CURSOR WM_USER+203
+#define WM_DEBUG_STOP WM_USER+204
+#define WM_DEBUG_PAUSE WM_USER+205
+
+CDebugger::CDebugger(){
+ hwnd=0;
+ bDebugging=0;
+}
+CDebugger::~CDebugger(){
+}
+
+BOOL CDebugger::IsDebugging(void){
+ return bDebugging;
+}
+BOOL CDebugger::IsDebuggerView(void){
+ if(hwnd) return 1;
+ return 0;
+}
+
+void CDebugger::resize(int x,int y,int cx,int cy){
+ MoveWindow(hwnd,x,y,cx,cy,1);
+}
+
+void CDebugger::ResetCommandEnabled(void){
+ if(bDebugging==0){
+ BOOL bEnableDocument=0, bBreakPoint=0;
+
+ HWND hChild;
+ hChild=GetWindow(hClient,GW_CHILD);
+
+ if(ProjectInfo.name[0]){
+ //有効(プロジェクトを開いているとき)
+ bEnableDocument=1;
+ }
+ else{
+ if(IsWindow(hChild)){
+ if(MdiInfo[GetWndNum(hChild)].DocType==WNDTYPE_BASIC){
+ //有効(Basicプログラムファイルを開いているとき)
+ bEnableDocument=1;
+ }
+ }
+ }
+
+ if(IsWindow(hChild)){
+ if(MdiInfo[GetWndNum(hChild)].DocType==WNDTYPE_BASIC){
+ //ブレークポイント有効(Basicプログラムファイルを開いているとき)
+ bBreakPoint=1;
+ }
+ }
+
+ int MenuMsg;
+ if(bEnableDocument) MenuMsg=MF_BYCOMMAND|MF_ENABLED;
+ else MenuMsg=MF_BYCOMMAND|MF_GRAYED;
+
+ //リリースコンパイル
+ pobj_MainMenu->EnableItem(IDM_RELEASECOMPILE,MenuMsg);
+ pobj_ReleaseToolbar->EnableItem(IDM_RELEASECOMPILE,bEnableDocument);
+
+ //リリース実行
+ pobj_MainMenu->EnableItem(IDM_RELEASERUN,MenuMsg);
+ pobj_ReleaseToolbar->EnableItem(IDM_RELEASERUN,bEnableDocument);
+
+ //デバッグコンパイル
+ pobj_MainMenu->EnableItem(IDM_DEBUGCOMPILE,MenuMsg);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUGCOMPILE,bEnableDocument);
+
+ //デバッグ実行
+ pobj_MainMenu->EnableItem(IDM_DEBUG,MenuMsg);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUG,bEnableDocument);
+
+ if(bEnableDocument==0){
+ //ステップ実行
+ pobj_MainMenu->EnableItem(IDM_STEP_IN,MenuMsg);
+ pobj_MainMenu->EnableItem(IDM_STEP_OVER,MenuMsg);
+ pobj_MainMenu->EnableItem(IDM_STEP_CURSOR,MenuMsg);
+ pobj_DebuggerToolbar->EnableItem(IDM_STEP_IN,bEnableDocument);
+ pobj_DebuggerToolbar->EnableItem(IDM_STEP_OVER,bEnableDocument);
+ pobj_DebuggerToolbar->EnableItem(IDM_STEP_CURSOR,bEnableDocument);
+
+ //デバッグの一時停止
+ pobj_MainMenu->EnableItem(IDM_DEBUG_PAUSE,MenuMsg);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_PAUSE,bEnableDocument);
+
+ //デバッグの中断
+ pobj_MainMenu->EnableItem(IDM_DEBUG_STOP,MenuMsg);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_STOP,bEnableDocument);
+ }
+
+ if(bBreakPoint) MenuMsg=MF_BYCOMMAND|MF_ENABLED;
+ else MenuMsg=MF_BYCOMMAND|MF_GRAYED;
+
+ //ブレークポイント
+ pobj_MainMenu->EnableItem(IDM_BREAKPOINT,MenuMsg);
+ pobj_DebuggerToolbar->EnableItem(IDM_BREAKPOINT,bBreakPoint);
+
+
+
+
+ //プラットフォームセレクト
+ extern HWND hSelectCompilerCombo;
+ EnableWindow(hSelectCompilerCombo,bEnableDocument);
+ }
+}
+
+void CDebugger::SaftyCheck(void){
+ extern HWND hCompileView;
+ if(!IsWindow(hCompileView)){
+ SendMessage(hOwner,WM_DESTROYDEBUGGERVIEW,0,0);
+ SendMessage(hOwner,WM_DESTROYDEBUGGERBASE,0,0);
+ SendMessage(hOwner,WM_DESTROYCOMPILEVIEW,0,0);
+ }
+}
+
+
+
+/////////////////////////////////////////
+// デバッグ開始
+/////////////////////////////////////////
+void CDebugger::begin(void){
+ bDebugging=1;
+
+ if(pobj_MainMenu){
+ //リリースコンパイルを無効化
+ pobj_MainMenu->EnableItem(IDM_RELEASECOMPILE,MF_BYCOMMAND|MF_GRAYED);
+ pobj_DebuggerToolbar->EnableItem(IDM_RELEASECOMPILE,0);
+
+ //デバッグコンパイルを無効化
+ pobj_MainMenu->EnableItem(IDM_DEBUGCOMPILE,MF_BYCOMMAND|MF_GRAYED);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUGCOMPILE,0);
+
+ //デバッグ実行を無効化
+ pobj_MainMenu->EnableItem(IDM_DEBUG,MF_BYCOMMAND|MF_GRAYED);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUG,0);
+
+ //ステップ実行を無効化
+ pobj_MainMenu->EnableItem(IDM_STEP_IN,MF_BYCOMMAND|MF_GRAYED);
+ pobj_MainMenu->EnableItem(IDM_STEP_OVER,MF_BYCOMMAND|MF_GRAYED);
+ pobj_MainMenu->EnableItem(IDM_STEP_CURSOR,MF_BYCOMMAND|MF_GRAYED);
+ pobj_DebuggerToolbar->EnableItem(IDM_STEP_IN,0);
+ pobj_DebuggerToolbar->EnableItem(IDM_STEP_OVER,0);
+ pobj_DebuggerToolbar->EnableItem(IDM_STEP_CURSOR,0);
+
+ //デバッグの一時停止を有効化
+ pobj_MainMenu->EnableItem(IDM_DEBUG_PAUSE,MF_BYCOMMAND|MF_ENABLED);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_PAUSE,1);
+
+ //デバッグの中断を有効化
+ pobj_MainMenu->EnableItem(IDM_DEBUG_STOP,MF_BYCOMMAND|MF_ENABLED);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_STOP,1);
+ }
+}
+
+
+/////////////////////////////////////////
+// デバッグ終了
+/////////////////////////////////////////
+void CDebugger::end(void){
+ bDebugging=0;
+
+ if(pobj_MainMenu){
+ //リリースコンパイルを有効化
+ pobj_MainMenu->EnableItem(IDM_RELEASECOMPILE,MF_BYCOMMAND|MF_ENABLED);
+ pobj_DebuggerToolbar->EnableItem(IDM_RELEASECOMPILE,1);
+
+ //デバッグコンパイルを有効化
+ pobj_MainMenu->EnableItem(IDM_DEBUGCOMPILE,MF_BYCOMMAND|MF_ENABLED);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUGCOMPILE,1);
+
+ //デバッグ実行を有効化
+ pobj_MainMenu->EnableItem(IDM_DEBUG,MF_BYCOMMAND|MF_ENABLED);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUG,1);
+
+ //ステップ実行を無効化
+ pobj_MainMenu->EnableItem(IDM_STEP_IN,MF_BYCOMMAND|MF_GRAYED);
+ pobj_MainMenu->EnableItem(IDM_STEP_OVER,MF_BYCOMMAND|MF_GRAYED);
+ pobj_MainMenu->EnableItem(IDM_STEP_CURSOR,MF_BYCOMMAND|MF_GRAYED);
+ pobj_DebuggerToolbar->EnableItem(IDM_STEP_IN,0);
+ pobj_DebuggerToolbar->EnableItem(IDM_STEP_OVER,0);
+ pobj_DebuggerToolbar->EnableItem(IDM_STEP_CURSOR,0);
+
+ //デバッグの一時停止を無効化
+ pobj_MainMenu->EnableItem(IDM_DEBUG_PAUSE,MF_BYCOMMAND|MF_GRAYED);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_PAUSE,0);
+
+ //デバッグの中断を無効化
+ pobj_MainMenu->EnableItem(IDM_DEBUG_STOP,MF_BYCOMMAND|MF_GRAYED);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_STOP,0);
+ }
+}
+
+
+/////////////////////////////////////////
+// 一時停止(ウォッチウィンドウが立ち上がる)
+/////////////////////////////////////////
+void CDebugger::watch_start(HWND hDebuggerView){
+ hwnd=hDebuggerView;
+
+ if(pobj_MainMenu){
+ //継続を有効化
+ pobj_MainMenu->EnableItem(IDM_DEBUG,MF_BYCOMMAND|MF_ENABLED);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUG,1);
+
+ //ステップ実行を有効化
+ pobj_MainMenu->EnableItem(IDM_STEP_IN,MF_BYCOMMAND|MF_ENABLED);
+ pobj_MainMenu->EnableItem(IDM_STEP_OVER,MF_BYCOMMAND|MF_ENABLED);
+ pobj_MainMenu->EnableItem(IDM_STEP_CURSOR,MF_BYCOMMAND|MF_ENABLED);
+ pobj_DebuggerToolbar->EnableItem(IDM_STEP_IN,1);
+ pobj_DebuggerToolbar->EnableItem(IDM_STEP_OVER,1);
+ pobj_DebuggerToolbar->EnableItem(IDM_STEP_CURSOR,1);
+
+ //デバッグの一時停止を無効化
+ pobj_MainMenu->EnableItem(IDM_DEBUG_PAUSE,MF_BYCOMMAND|MF_GRAYED);
+ pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_PAUSE,0);
+ }
+}
+
+
+/////////////////////////////////////////
+// デバッグを再開
+/////////////////////////////////////////
+void CDebugger::watch_quit(void){
+ hwnd=0;
+
+ begin();
+}
+
+
+void CDebugger::DebugContinue(void){
+ if(hwnd) SendMessage(hwnd,WM_DEBUG_CONTINUE,0,0);
+}
+void CDebugger::StepIn(void){
+ if(hwnd) SendMessage(hwnd,WM_STEP_IN,0,0);
+}
+void CDebugger::StepOver(void){
+ if(hwnd) SendMessage(hwnd,WM_STEP_OVER,0,0);
+}
+void CDebugger::StepToCursor(void){
+ if(hwnd){
+ int WndNum;
+ WndNum=GetNowWndNum();
+ if(WndNum==-1) return;
+
+ char temporary[MAX_PATH];
+ sprintf(temporary,"\"%s\",%d",MdiInfo[WndNum].path,MdiInfo[WndNum].pmti->StartCaretPos.y);
+
+ char temp2[MAX_PATH];
+ GetTempPath(MAX_PATH,temp2);
+ if(temp2[lstrlen(temp2)-1]!='\\') lstrcat(temp2,"\\");
+ lstrcat(temp2,"ab_breakpoint.tmp");
+
+ WriteBuffer(temp2,temporary,lstrlen(temporary));
+
+ SendMessage(hwnd,WM_STEP_CURSOR,0,0);
+ }
+}
+void CDebugger::DebugStop(void){
+ extern HWND hCompileView;
+ SendMessage(hCompileView,WM_DEBUG_STOP,0,0);
+}
+void CDebugger::DebugPause(void){
+ extern HWND hCompileView;
+ SendMessage(hCompileView,WM_DEBUG_PAUSE,0,0);
+}
+
+
+
+
+
+
+//////////////////////////
+// ブレークポイント
+//////////////////////////
+
+CFileBreakPoint::CFileBreakPoint(char *lpszFileName,int iLineNum){
+ this->lpszFileName=(char *)HeapAlloc(hHeap,0,lstrlen(lpszFileName)+1);
+ lstrcpy(this->lpszFileName,lpszFileName);
+
+ piLine=(int *)HeapAlloc(hHeap,0,sizeof(int));
+ piLine[0]=iLineNum;
+ num=1;
+}
+CFileBreakPoint::~CFileBreakPoint(){
+ HeapDefaultFree(lpszFileName);
+ HeapDefaultFree(piLine);
+}
+void CFileBreakPoint::add(int iLineNum){
+ piLine=(int *)HeapReAlloc(hHeap,0,piLine,(num+1)*sizeof(int));
+
+ int i;
+ for(i=0;iiLineNum){
+ for(int i2=num;i2>i;i2--){
+ piLine[i2]=piLine[i2-1];
+ }
+ break;
+ }
+ }
+
+ piLine[i]=iLineNum;
+ num++;
+}
+void CFileBreakPoint::remove(int iLineNum){
+ int i;
+ for(i=0;icpMin;i++){
+ if(IsReturnCode(lpszBuffer+i)){
+ DelStartLine++;
+ }
+ }
+
+ int DelEndLine=DelStartLine;
+ for(;icpMax;i++){
+ if(IsReturnCode(lpszBuffer+i)){
+ DelEndLine++;
+ }
+ }
+
+ //ブレークポイントを消去
+ for(i=0;ilpszFileName,lpszFileName)==0){
+ ppItem[i]->add(iLineNum);
+ return;
+ }
+ }
+
+ if(i==num){
+ ppItem=(CFileBreakPoint **)HeapReAlloc(hHeap,0,ppItem,(num+1)*sizeof(CFileBreakPoint *));
+ ppItem[num]=new CFileBreakPoint(lpszFileName,iLineNum);
+ num++;
+ }
+}
+void CDBBreakPoint::remove(char *lpszFileName,int iLineNum){
+ int i;
+ for(i=0;ilpszFileName)==0){
+ ppItem[i]->remove(iLineNum);
+ break;
+ }
+ }
+ if(i==num) return;
+
+ if(ppItem[i]->num==0){
+ delete ppItem[i];
+
+ num--;
+ for(;ilpszFileName)==0){
+ for(i2=0;i2num;i2++){
+ if(MdiInfo[WndNum].pmti->StartCaretPos.y==ppItem[i]->piLine[i2]){
+ sw=1;
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ if(sw==0){
+ //ブレークポイントを追加
+ insert(MdiInfo[WndNum].path,MdiInfo[WndNum].pmti->StartCaretPos.y);
+ }
+ else{
+ //ブレークポイントを削除
+ remove(MdiInfo[WndNum].path,MdiInfo[WndNum].pmti->StartCaretPos.y);
+ }
+
+ if(pobj_Debugger->IsDebugging()){
+ SaveToTempFile();
+
+ //デバッガにブレークポイント更新のメッセージを送る
+ //未完成
+ }
+
+ //エディタを再描画
+ InvalidateRect(MdiInfo[WndNum].pmti->hEdit,NULL,0);
+}
+void CDBBreakPoint::SaveToTempFile(void){
+ char *buffer;
+ int length=0;
+ buffer=(char *)HeapAlloc(hHeap,0,65535);
+ buffer[0]=0;
+ int i,i2;
+ for(i=0;ilpszFileName);
+ length+=lstrlen(buffer+length);
+
+ for(i2=0;i2num;i2++){
+ sprintf(buffer+length,",%d",ppItem[i]->piLine[i2]);
+ length+=lstrlen(buffer+length);
+ }
+
+ lstrcpy(buffer+length,"\n");
+ length+=lstrlen(buffer+length);
+ }
+
+ HANDLE hFile;
+ char temporary[MAX_PATH];
+ GetTempPath(MAX_PATH,temporary);
+ if(temporary[lstrlen(temporary)-1]!='\\') lstrcat(temporary,"\\");
+ lstrcat(temporary,"ab_breakpoint.tmp");
+
+ //未完成
+ sprintf(temporary,"%sab_breakpoint.tmp",pj_editor_Dir);
+
+ hFile=CreateFile(temporary,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_TEMPORARY,NULL);
+ DWORD dwAccBytes;
+ WriteFile(hFile,buffer,lstrlen(buffer),&dwAccBytes,NULL);
+ CloseHandle(hFile);
+
+ HeapDefaultFree(buffer);
+}
+
+
+CFileBreakPoint *CDBBreakPoint::EnumLines(char *lpszFilePath){
+ int i;
+ for(i=0;ilpszFileName)==0){
+ return ppItem[i];
+ }
+ }
+ return 0;
+}
+
+void CDBBreakPoint::replace(LPSTR lpszFilePath,LPSTR lpszBuffer,CHARRANGE *pDelRange,CHARRANGE *pRange,LPSTR lpszNewStr){
+ int i;
+ for(i=0;ilpszFileName,lpszFilePath)==0){
+ ppItem[i]->replace(lpszBuffer,pDelRange,pRange,lpszNewStr);
+ return;
+ }
+ }
+}
+
+
+
+#endif //THETEXT
Index: /ProjectEditor/Debugger.h
===================================================================
--- /ProjectEditor/Debugger.h (revision 3)
+++ /ProjectEditor/Debugger.h (revision 3)
@@ -0,0 +1,83 @@
+
+class CDebugger{
+ BOOL bDebugging;
+public:
+ HWND hwnd;
+
+ CDebugger::CDebugger();
+ CDebugger::~CDebugger();
+
+ BOOL IsDebugging(void);
+ BOOL IsDebuggerView(void);
+
+ void resize(int x,int y,int cx,int cy);
+
+ void ResetCommandEnabled(void);
+
+ void SaftyCheck(void);
+
+ void begin(void);
+ void end(void);
+ void watch_start(HWND hDebuggerView);
+ void watch_quit(void);
+
+
+ /////////////////////////////////
+ // イベントによるアプリ間通信
+ /////////////////////////////////
+
+ void DebugContinue(void);
+ void StepIn(void);
+ void StepOver(void);
+ void StepToCursor(void);
+
+ void DebugStop(void);
+ void DebugPause(void);
+};
+
+extern CDebugger *pobj_Debugger;
+
+
+
+
+
+/////////////////////////////////
+// ブレークポイント
+/////////////////////////////////
+
+class CFileBreakPoint{
+public:
+ char *lpszFileName;
+
+ int *piLine;
+ int num;
+
+ CFileBreakPoint(char *lpszFileName,int iLineNum);
+ ~CFileBreakPoint();
+
+ void add(int iLineNum);
+ void remove(int iLineNum);
+
+ BOOL check(int iLineNum);
+
+ void replace(LPSTR lpszBuffer,CHARRANGE *pDelRange,CHARRANGE *pRange,LPSTR lpszNewStr);
+};
+
+class CDBBreakPoint{
+ CFileBreakPoint **ppItem;
+ int num;
+
+public:
+ CDBBreakPoint();
+ ~CDBBreakPoint();
+
+ void insert(char *lpszFileName,int iLineNum);
+ void remove(char *lpszFileName,int iLineNum);
+
+ void Event_BreakPoint(void);
+ void SaveToTempFile(void);
+
+ CFileBreakPoint *EnumLines(char *lpszFilePath);
+
+ void replace(LPSTR lpszFilePath,LPSTR lpszBuffer,CHARRANGE *pDelRange,CHARRANGE *pRange,LPSTR lpszNewStr);
+};
Index: /ProjectEditor/DesignTheme.cpp
===================================================================
--- /ProjectEditor/DesignTheme.cpp (revision 3)
+++ /ProjectEditor/DesignTheme.cpp (revision 3)
@@ -0,0 +1,191 @@
+#include "common.h"
+
+
+CDBTheme *pobj_DBTheme;
+
+
+CTheme::CTheme(char *path,char *name){
+ bActive=0;
+ lstrcpy(m_name,name);
+ if(path==0) return;
+
+ buffer=ReadBuffer(path);
+
+
+ //通常の文字色
+ GetRGBValue("rgbDefault",&TextColorInfo.rgbDefault);
+
+ //コメント文字色
+ GetRGBValue("rgbComment",&TextColorInfo.rgbComment);
+
+ //特殊ステートメント
+ GetRGBValue("rgbStatement",&TextColorInfo.rgbStatement);
+
+ //文字列色
+ GetRGBValue("rgbString",&TextColorInfo.rgbString);
+
+ //背景色(カーソル行)
+ GetRGBValue("rgbCursorBack",&TextColorInfo.rgbCursorBack);
+
+ //背景色(一般)
+ GetRGBValue("rgbBackground",&TextColorInfo.rgbBackground);
+
+ //背景画像
+ if(!GetStringValue("BackgroundImagePath",szBackgroundImagePath)) szBackgroundImagePath[0]=0;
+
+ HeapDefaultFree(buffer);
+}
+CTheme::CTheme(){
+ CTheme(0,THEMENAME_USER);
+}
+CTheme::~CTheme(){
+}
+
+void CTheme::save(){
+ buffer=(char *)HeapAlloc(hHeap,0,65536);
+ buffer[0]=0;
+
+
+ //通常の文字色
+ SetRGBValue("rgbDefault",TextColorInfo.rgbDefault);
+
+ //コメント文字色
+ SetRGBValue("rgbComment",TextColorInfo.rgbComment);
+
+ //特殊ステートメント
+ SetRGBValue("rgbStatement",TextColorInfo.rgbStatement);
+
+ //文字列色
+ SetRGBValue("rgbString",TextColorInfo.rgbString);
+
+ //背景色(カーソル行)
+ SetRGBValue("rgbCursorBack",TextColorInfo.rgbCursorBack);
+
+ //背景色(一般)
+ SetRGBValue("rgbBackground",TextColorInfo.rgbBackground);
+
+ //背景画像
+ SetStringValue("BackgroundImagePath",szBackgroundImagePath);
+
+ char path[MAX_PATH];
+ sprintf(path,"%sTheme\\%s",pj_editor_Dir,m_name);
+ if(!IsFile(path)){
+ CreateDirectory(path,NULL);
+ }
+
+ sprintf(path,"%sTheme\\%s\\design.ini",pj_editor_Dir,m_name);
+ WriteBuffer(path,buffer,lstrlen(buffer));
+
+ HeapDefaultFree(buffer);
+}
+
+
+CDBTheme::CDBTheme(){
+ hBackBmp=0;
+
+ iNum=0;
+ ppobj_Theme=(CTheme **)HeapAlloc(hHeap,0,1);
+
+ char temporary[MAX_PATH];
+ sprintf(temporary,"%sTheme\\*",pj_editor_Dir);
+
+ HANDLE hFind;
+ WIN32_FIND_DATA wfd;
+ hFind=FindFirstFile(temporary,&wfd);
+ if(hFind!=INVALID_HANDLE_VALUE){
+ do{
+ if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
+ if(!(lstrcmp(wfd.cFileName,".")==0||lstrcmp(wfd.cFileName,"..")==0)){
+ //ディレクトリのとき
+ sprintf(temporary,"%sTheme\\%s\\design.ini",pj_editor_Dir,wfd.cFileName);
+ if(IsFile(temporary)){
+ add(temporary,wfd.cFileName);
+ }
+ }
+ }
+ else{
+ //ファイルのとき
+ //無視
+ }
+ }while(FindNextFile(hFind,&wfd));
+ }
+}
+CDBTheme::~CDBTheme(){
+ int i;
+ for(i=0;im_name,name)==0){
+ return ppobj_Theme[i];
+ }
+ }
+ return 0;
+}
+
+CTheme *CDBTheme::add(char *path,char *name){
+ ppobj_Theme=(CTheme **)HeapReAlloc(hHeap,0,ppobj_Theme,(iNum+1)*sizeof(CTheme *));
+ ppobj_Theme[iNum]=new CTheme(path,name);
+ iNum++;
+
+ return ppobj_Theme[iNum-1];
+}
+void CDBTheme::ResetTheme_ToComboBox(HWND hCombo){
+ int i;
+ for(i=0;im_name);
+ }
+
+ //選択する
+ for(i=0;im_name,pobj_nv->szActiveTheme)==0){
+ i=SendMessage(hCombo,CB_FINDSTRINGEXACT,0,(LPARAM)ppobj_Theme[i]->m_name);
+ SendMessage(hCombo,CB_SETCURSEL,i,0);
+ break;
+ }
+ }
+}
+CTheme *CDBTheme::GetActiveTheme(){
+ int i;
+ for(i=0;im_name,pobj_nv->szActiveTheme)==0){
+ return ppobj_Theme[i];
+ }
+ }
+ return 0;
+}
+
+void CDBTheme::lock(void){
+ CTheme *pobj_Theme;
+ pobj_Theme=GetActiveTheme();
+
+ if(pobj_Theme->szBackgroundImagePath[0]=='\0'){
+ hBackBmp=0;
+ return;
+ }
+
+ char szThemeDir[MAX_PATH];
+ sprintf(szThemeDir,"%sTheme\\%s\\",pj_editor_Dir,pobj_Theme->m_name);
+
+ char temporary[MAX_PATH];
+ lstrcpy(temporary,pobj_Theme->szBackgroundImagePath);
+ GetFullPath(temporary,szThemeDir);
+
+ hBackBmp=(HBITMAP)LoadImage(0,temporary,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
+
+ BITMAP Bitmap;
+ GetObject(hBackBmp,sizeof(BITMAP),&Bitmap);
+ sizeBackBmp.cx=Bitmap.bmWidth;
+ sizeBackBmp.cy=Bitmap.bmHeight;
+}
+void CDBTheme::unlock(void){
+ if(hBackBmp) DeleteObject(hBackBmp);
+}
Index: /ProjectEditor/DesignTheme.h
===================================================================
--- /ProjectEditor/DesignTheme.h (revision 3)
+++ /ProjectEditor/DesignTheme.h (revision 3)
@@ -0,0 +1,53 @@
+
+
+#define THEMENAME_CLASSIC "Classic"
+#define THEMENAME_USER "User Setting"
+
+
+struct TEXTEDIT_COLOR_INFO{
+ COLORREF rgbDefault; //通常の文字
+ COLORREF rgbComment; //コメント
+ COLORREF rgbStatement; //特殊ステートメント
+ COLORREF rgbString; //文字列
+ COLORREF rgbCursorBack; //背景色(カーソル行)
+ COLORREF rgbBackground; //背景色(一般)
+};
+extern TEXTEDIT_COLOR_INFO tci;
+
+
+class CTheme:public CSettingFile{
+public:
+ BOOL bActive;
+ char m_name[MAX_PATH];
+ TEXTEDIT_COLOR_INFO TextColorInfo;
+ char szBackgroundImagePath[MAX_PATH];
+
+ CTheme(char *path,char *name);
+ CTheme();
+ ~CTheme();
+
+ void save(void);
+};
+
+class CDBTheme{
+public:
+ int iNum;
+ CTheme **ppobj_Theme;
+
+ CDBTheme();
+ ~CDBTheme();
+ CTheme *dupli_check(char *name);
+
+ CTheme *add(char *path,char *name);
+
+ void ResetTheme_ToComboBox(HWND hCombo);
+
+ CTheme *GetActiveTheme();
+
+ HBITMAP hBackBmp;
+ SIZE sizeBackBmp;
+ void lock(void);
+ void unlock(void);
+};
+
+extern CDBTheme *pobj_DBTheme;
Index: /ProjectEditor/DialogBoxes.cpp
===================================================================
--- /ProjectEditor/DialogBoxes.cpp (revision 3)
+++ /ProjectEditor/DialogBoxes.cpp (revision 3)
@@ -0,0 +1,2297 @@
+#include "Common.h"
+
+//タブ用
+BOOL SetSwitch[32];
+
+
+void SetPosCenter(HWND hParent,HWND hwnd){
+ RECT owrect,rect;
+ int x,y;
+
+ if(IsWindow(hParent)) GetWindowRect(hParent,&owrect);
+ else{
+ owrect.left=0;
+ owrect.top=0;
+ owrect.right=ScreenX;
+ owrect.bottom=ScreenY;
+ }
+ GetWindowRect(hwnd,&rect);
+ x=((owrect.right-owrect.left)-(rect.right-rect.left))/2+owrect.left;
+ y=((owrect.bottom-owrect.top)-(rect.bottom-rect.top))/2+owrect.top;
+ SetWindowPos(hwnd,0,x,y,0,0,SWP_NOSIZE);
+}
+void SetPosCenter(HWND hwnd){
+ SetPosCenter(hOwner,hwnd);
+}
+BOOL SetFontDialog(HWND hwnd,LOGFONT *lf,BOOL bFixedPitchOnly,int *lpiPointSize){
+ CHOOSEFONT cf;
+ LOGFONT lfDummy;
+
+ lfDummy=*lf;
+ memset(&cf,0,sizeof(CHOOSEFONT));
+ cf.lStructSize=sizeof(CHOOSEFONT);
+ cf.hwndOwner=hwnd;
+ cf.lpLogFont=&lfDummy;
+ cf.Flags=CF_SCREENFONTS|CF_INITTOLOGFONTSTRUCT;
+ if(bFixedPitchOnly) cf.Flags|=CF_FIXEDPITCHONLY|CF_NOVERTFONTS;
+ cf.nFontType=SCREEN_FONTTYPE;
+ lstrcpy((char *)cf.lpTemplateName,"Font select");
+
+ if(!ChooseFont(&cf)) return 0;
+
+ memcpy(lf,&lfDummy,sizeof(LOGFONT));
+
+ if(lpiPointSize) *lpiPointSize=cf.iPointSize;
+
+ return 1;
+}
+
+
+
+//////////////////////////////////
+// プロジェクト新規作成ウィザード
+//////////////////////////////////
+
+//プロジェクト作成項目
+#if defined(JPN)
+//日本語
+#define TEXT_BASE_NORMAL "ノーマル ウィンドウをベースに、GUIアプリケーションを作成します。"
+#define TEXT_BASE_PROMPT "プロンプト ウィンドウをベースに、N88BASIC互換プログラムを作成します。"
+#define TEXT_BASE_DOSPROMPT "コンソール アプリケーションを作成します。Windows上で稼動するDOSプロンプトでの入出力が可能になります。"
+#define TEXT_NOBASE "空のプロジェクトを作成します。"
+#define TEXT_DIRECTX "DirectXに対応したアプリケーションを作成します。2Dまたは3Dの描画を高速に行うことができ、ゲームアプリケーションなどの開発に最適です。"
+#define TEXT_DLL "ダイナミック リンク ライブラリ(DLL)を作成します。"
+#else
+//英語
+#define TEXT_BASE_NORMAL "You can make a GUI application of a normal window base."
+#define TEXT_BASE_PROMPT "You can make a N88 compatible program of a prompt window base."
+#define TEXT_BASE_DOSPROMPT "You can make a console application."
+#define TEXT_NOBASE "Empty project is created."
+#define TEXT_DIRECTX "You can make a DirectX application. It can draw 2D or 3D graphics at high speed and it is useful to a game programing."
+#define TEXT_DLL "You can make a DLL(Dynamic Link Library)."
+#endif
+
+void GetCheckTextBuffer(char *buffer){
+ extern NEWPROJECTINFO NewProjectInfo;
+ int i;
+
+#if defined(JPN)
+ //日本語
+ lstrcpy(buffer,"作成するプロジェクトの内容を確認して \"完了\" ボタンを押して下さい。\r\n\r\n");
+ i=lstrlen(buffer);
+ sprintf(buffer+i,"プロジェクト名: \"%s\"\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"ワーク ディレクトリ: \"%s\\%s\"\r\n\r\n",pobj_nv->ProjectSaveDir,NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+
+ if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
+ lstrcpy(buffer+i,"ノーマル ウィンドウを持つEXE形式の実行ファイルを作成します。\r\n\r\n");
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wnd … ウィンドウ デザイン保存用\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"MainWnd.ab … メイン ウィンドウのイベント プロシージャ用\r\n",NewProjectInfo.name);
+ }
+ else if(NewProjectInfo.dwTypeID==IDC_EXE_PROMPTBASE){
+ lstrcpy(buffer+i,"プロンプト ウィンドウを持つEXE形式の実行ファイルを作成します。\r\n\r\n");
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+ }
+ else if(NewProjectInfo.dwTypeID==IDC_EXE_DOSPROMPTBASE){
+ lstrcpy(buffer+i,"EXE形式のコンソール アプリケーションを作成します。\r\n\r\n");
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+ }
+ else if(NewProjectInfo.dwTypeID==IDC_EXE_NOBASE){
+ lstrcpy(buffer+i,"EXE形式の実行ファイルを作成します。\r\n\r\n");
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+ }
+ else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
+ lstrcpy(buffer+i,"EXE形式の実行ファイルを作成します。同時に、DirectXの操作に必要なソースコードを生成します。\r\n\r\n");
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"dx_graphics.sbp … DirectGraphicsサポート用ソースコード ファイル\r\n");
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"dx_input.sbp … DirectInputサポート用ソースコード ファイル\r\n");
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"dx_music.sbp … DirectMusicサポート用ソースコード ファイル\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+ }
+ else if(NewProjectInfo.dwTypeID==IDC_DLL){
+ lstrcpy(buffer+i,"ダイナミック リンク ライブラリ(DLL)を作成します。\r\n\r\n");
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+ }
+#else
+ //英語
+ lstrcpy(buffer,"Please check following points and click the \"Finish\" button.\r\n\r\n");
+ i=lstrlen(buffer);
+ sprintf(buffer+i,"Project Name: \"%s\"\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"Work Directory: \"%s\\%s\"\r\n\r\n",pobj_nv->ProjectSaveDir,NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+
+ if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
+ sprintf(buffer+i,"%s\r\n\r\n",TEXT_BASE_NORMAL);
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"--- Creation Files ---\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.pj … Project file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.idx … Index file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.ab … Main Source Code file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wnd … Data of Window Design\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wrk … Data of Work State\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"MainWnd.ab … Data of Event Procedures of the Main Window\r\n",NewProjectInfo.name);
+ }
+ else if(NewProjectInfo.dwTypeID==IDC_EXE_PROMPTBASE){
+ sprintf(buffer+i,"%s\r\n\r\n",TEXT_BASE_PROMPT);
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"--- Creation Files ---\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.pj … Creation Files\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.idx … Index file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.ab … Main Source Code file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wrk … Data of Work State\r\n",NewProjectInfo.name);
+ }
+ else if(NewProjectInfo.dwTypeID==IDC_EXE_DOSPROMPTBASE){
+ sprintf(buffer+i,"%s\r\n\r\n",TEXT_BASE_DOSPROMPT);
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"--- Creation Files ---\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.pj … Creation Files\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.idx … Index file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.ab … Main Source Code file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wrk … Data of Work State\r\n",NewProjectInfo.name);
+ }
+ else if(NewProjectInfo.dwTypeID==IDC_EXE_NOBASE){
+ sprintf(buffer+i,"%s\r\n\r\n",TEXT_NOBASE);
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"--- Creation Files ---\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.pj … Creation Files\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.idx … Index file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.ab … Main Source Code file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wrk … Data of Work State\r\n",NewProjectInfo.name);
+ }
+ else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
+ sprintf(buffer+i,"%s\r\n\r\n",TEXT_DIRECTX);
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"--- Creation Files ---\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.pj … Creation Files\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.idx … Index file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.ab … Main Source Code file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"dx_graphics.sbp … DirectGraphics is supported at this source file\r\n");
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"dx_input.sbp … DirectInput is supported at this source file\r\n");
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"dx_music.sbp … DirectMusic is supported at this source file\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wrk … Data of Work State\r\n",NewProjectInfo.name);
+ }
+ else if(NewProjectInfo.dwTypeID==IDC_DLL){
+ sprintf(buffer+i,"%s\r\n\r\n",TEXT_DLL);
+ i+=lstrlen(buffer+i);
+ lstrcpy(buffer+i,"--- Creation Files ---\r\n");
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.pj … Creation Files\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.idx … Index file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.ab … Main Source Code file\r\n",NewProjectInfo.name);
+ i+=lstrlen(buffer+i);
+ sprintf(buffer+i,"%s.wrk … Data of Work State\r\n",NewProjectInfo.name);
+ }
+#endif
+}
+BOOL CALLBACK DlgNewProject_Page3(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ char buffer[GENERAL_SIZE];
+ LPPSHNOTIFY lpPshNotify;
+ switch(message){
+ case WM_NOTIFY:
+ lpPshNotify=(LPPSHNOTIFY)lParam;
+ switch(lpPshNotify->hdr.code){
+ case PSN_SETACTIVE:
+ PropSheet_SetWizButtons(GetParent(hwnd),PSWIZB_FINISH|PSWIZB_BACK);
+
+ GetCheckTextBuffer(buffer);
+
+ SetDlgItemText(hwnd,IDC_PROJECTINFO,buffer);
+ SetTimer(hwnd,1,10,0);
+ return 1;
+ case PSN_WIZFINISH:
+ MakeNewProject();
+ return 1;
+ }
+ break;
+ case WM_TIMER:
+ KillTimer(hwnd,1);
+ SendDlgItemMessage(hwnd,IDC_PROJECTINFO,EM_SETSEL,0,0);
+ return 1;
+ }
+ return 0;
+}
+BOOL CALLBACK DlgNewProject_Page2(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern NEWPROJECTINFO NewProjectInfo;
+ LPPSHNOTIFY lpPshNotify;
+ switch(message){
+ case WM_INITDIALOG:
+
+ //#strict指定
+ SendDlgItemMessage(hwnd,IDC_STRICT,BM_SETCHECK,BST_CHECKED,0);
+
+ break;
+ case WM_NOTIFY:
+ lpPshNotify=(LPPSHNOTIFY)lParam;
+ switch(lpPshNotify->hdr.code){
+ case PSN_SETACTIVE:
+ //DirectXアプリのときはMMSYSをチェック
+ if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
+ SendDlgItemMessage(hwnd,IDC_API_MMSYS,BM_SETCHECK,BST_CHECKED,0);
+ EnableWindow(GetDlgItem(hwnd,IDC_API_MMSYS),0);
+ }
+ else{
+ EnableWindow(GetDlgItem(hwnd,IDC_API_MMSYS),1);
+ }
+
+ PropSheet_SetWizButtons(GetParent(hwnd),PSWIZB_NEXT|PSWIZB_BACK);
+ return 1;
+ case PSN_WIZNEXT:
+ NewProjectInfo.dwOption=PJ_OP_RC_MANIFEST;
+ if(SendDlgItemMessage(hwnd,IDC_STRICT,BM_GETCHECK,0,0))
+ NewProjectInfo.dwOption|=PJ_OP_STRICT;
+ if(SendDlgItemMessage(hwnd,IDC_API_COMMCTRL,BM_GETCHECK,0,0))
+ NewProjectInfo.dwOption|=PJ_OP_COMMCTRL;
+ if(SendDlgItemMessage(hwnd,IDC_API_MMSYS,BM_GETCHECK,0,0))
+ NewProjectInfo.dwOption|=PJ_OP_MMSYSTEM;
+ if(SendDlgItemMessage(hwnd,IDC_API_RICHEDIT,BM_GETCHECK,0,0))
+ NewProjectInfo.dwOption|=PJ_OP_RICHEDIT;
+ if(SendDlgItemMessage(hwnd,IDC_API_WINSOCK,BM_GETCHECK,0,0))
+ NewProjectInfo.dwOption|=PJ_OP_WINSOCK;
+ return 1;
+ }
+ break;
+ }
+ return 0;
+}
+void AppImage_ShowOrHide(HWND hDlg,int id){
+ int nCmd;
+
+ if(id==IDC_EXE_WINDOWBASE) nCmd=SW_SHOW;
+ else nCmd=SW_HIDE;
+ ShowWindow(GetDlgItem(hDlg,IDC_IMAGE_WINDOW),nCmd);
+
+ if(id==IDC_EXE_PROMPTBASE) nCmd=SW_SHOW;
+ else nCmd=SW_HIDE;
+ ShowWindow(GetDlgItem(hDlg,IDC_IMAGE_PROMPT),nCmd);
+
+ if(id==IDC_EXE_DOSPROMPTBASE) nCmd=SW_SHOW;
+ else nCmd=SW_HIDE;
+ ShowWindow(GetDlgItem(hDlg,IDC_IMAGE_DOSPROMPT),nCmd);
+
+ if(id==IDC_EXE_NOBASE) nCmd=SW_SHOW;
+ else nCmd=SW_HIDE;
+ ShowWindow(GetDlgItem(hDlg,IDC_IMAGE_NON),nCmd);
+
+ if(id==IDC_EXE_DIRECTX) nCmd=SW_SHOW;
+ else nCmd=SW_HIDE;
+ ShowWindow(GetDlgItem(hDlg,IDC_IMAGE_DIRECTX),nCmd);
+}
+BOOL CALLBACK DlgNewProject_Page1(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern NEWPROJECTINFO NewProjectInfo;
+ int i;
+ char temporary[MAX_PATH];
+ LPPSHNOTIFY lpPshNotify;
+
+ switch(message){
+ case WM_INITDIALOG:
+ SetPosCenter(GetParent(hwnd));
+
+ SetDlgItemText(hwnd,IDC_DIRPATH,pobj_nv->ProjectSaveDir);
+ SendDlgItemMessage(hwnd,IDC_EXE_WINDOWBASE,BM_SETCHECK,BST_CHECKED,0);
+ SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_BASE_NORMAL);
+ break;
+ case WM_COMMAND:
+ if(HIWORD(wParam)==EN_CHANGE){
+ if(GetWindowTextLength(GetDlgItem(hwnd,IDC_PROJECTNAME))==0||
+ GetWindowTextLength(GetDlgItem(hwnd,IDC_DIRPATH))==0){
+ PropSheet_SetWizButtons(GetParent(hwnd),0);
+ }
+ else PropSheet_SetWizButtons(GetParent(hwnd),PSWIZB_NEXT);
+ }
+ switch(LOWORD(wParam)){
+ case IDC_PATHBROWSE:
+ //"ディレクトリを選択して下さい"
+ if(!GetFolder(hwnd,temporary,STRING_DIRECTORY_SELECT)) return 1;
+ SetDlgItemText(hwnd,IDC_DIRPATH,temporary);
+ return 1;
+ case IDC_EXE_WINDOWBASE:
+ AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+ SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_BASE_NORMAL);
+ EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),1);
+ return 1;
+ case IDC_EXE_PROMPTBASE:
+ AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+ SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_BASE_PROMPT);
+ EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),1);
+ return 1;
+ case IDC_EXE_DOSPROMPTBASE:
+ AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+ SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_BASE_DOSPROMPT);
+ EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),1);
+ return 1;
+ case IDC_EXE_NOBASE:
+ AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+ SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_NOBASE);
+ EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),0);
+ return 1;
+ case IDC_EXE_DIRECTX:
+ AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+ SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_DIRECTX);
+ EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),0);
+ return 1;
+ case IDC_DLL:
+ AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+ SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_DLL);
+ EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),0);
+ return 1;
+ }
+ break;
+ case WM_NOTIFY:
+ lpPshNotify=(LPPSHNOTIFY)lParam;
+ switch(lpPshNotify->hdr.code){
+ case PSN_SETACTIVE:
+ SendMessage(hwnd,WM_COMMAND,MAKELONG(0,EN_CHANGE),0);
+ return 1;
+ case PSN_WIZNEXT:
+ GetDlgItemText(hwnd,IDC_PROJECTNAME,NewProjectInfo.name,MAX_PATH);
+ if(!IsVariableTopChar(NewProjectInfo.name[0])){
+ //"プロジェクト名の先頭文字はアルファベット(A~Z、a~z)またはアンダーバー(_)でなければなりません。"
+ MessageBox(hwnd,STRING_ERROR_PROJECTTOPCHAR,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+ SetWindowLong(hwnd,DWL_MSGRESULT,-1);
+ return 1;
+ }
+ for(i=1;;i++){
+ if(NewProjectInfo.name[i]=='\0') break;
+ if(!IsVariableChar(NewProjectInfo.name[i])){
+ //"プロジェクト名に不正な文字コードが含まれています。"
+ MessageBox(hwnd,STRING_ERROR_PROJECTNAME,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+ SetWindowLong(hwnd,DWL_MSGRESULT,-1);
+ return 1;
+ }
+ }
+ GetDlgItemText(hwnd,IDC_DIRPATH,pobj_nv->ProjectSaveDir,MAX_PATH);
+
+ //ベース選択
+ if(SendDlgItemMessage(hwnd,IDC_EXE_WINDOWBASE,BM_GETCHECK,0,0))
+ NewProjectInfo.dwTypeID=IDC_EXE_WINDOWBASE;
+ else if(SendDlgItemMessage(hwnd,IDC_EXE_PROMPTBASE,BM_GETCHECK,0,0))
+ NewProjectInfo.dwTypeID=IDC_EXE_PROMPTBASE;
+ else if(SendDlgItemMessage(hwnd,IDC_EXE_DOSPROMPTBASE,BM_GETCHECK,0,0))
+ NewProjectInfo.dwTypeID=IDC_EXE_DOSPROMPTBASE;
+ else if(SendDlgItemMessage(hwnd,IDC_EXE_NOBASE,BM_GETCHECK,0,0))
+ NewProjectInfo.dwTypeID=IDC_EXE_NOBASE;
+ else if(SendDlgItemMessage(hwnd,IDC_EXE_DIRECTX,BM_GETCHECK,0,0))
+ NewProjectInfo.dwTypeID=IDC_EXE_DIRECTX;
+ else if(SendDlgItemMessage(hwnd,IDC_DLL,BM_GETCHECK,0,0))
+ NewProjectInfo.dwTypeID=IDC_DLL;
+
+ //"Hello World!"を表示するか
+ if(SendDlgItemMessage(hwnd,IDC_SHOWHELLOWORLD,BM_GETCHECK,0,0)) NewProjectInfo.ShowHelloWorld=1;
+ else NewProjectInfo.ShowHelloWorld=0;
+ return 1;
+ }
+ break;
+ }
+ return 0;
+}
+void DlgNewProjectWizard(HWND hwnd){
+#define MAX_NEWPROJECTPAGE 3
+ PROPSHEETHEADER psh;
+ PROPSHEETPAGE psp;
+ HPROPSHEETPAGE hpsp[MAX_NEWPROJECTPAGE];
+ int i;
+
+ psp.dwSize=sizeof(PROPSHEETPAGE);
+ psp.hInstance=hResInst;
+ psp.dwFlags=PSP_DEFAULT;
+
+ //各ページのセッティング
+ i=0;
+ psp.pszTemplate=MAKEINTRESOURCE(IDD_NEWPROJECT_PAGE1);
+ psp.pfnDlgProc=DlgNewProject_Page1;
+ hpsp[i]=CreatePropertySheetPage(&psp);
+ i++;
+ psp.pszTemplate=MAKEINTRESOURCE(IDD_NEWPROJECT_PAGE2);
+ psp.pfnDlgProc=DlgNewProject_Page2;
+ hpsp[i]=CreatePropertySheetPage(&psp);
+ i++;
+ psp.pszTemplate=MAKEINTRESOURCE(IDD_NEWPROJECT_PAGE3);
+ psp.pfnDlgProc=DlgNewProject_Page3;
+ hpsp[i]=CreatePropertySheetPage(&psp);
+
+ memset(&psh,0,sizeof(PROPSHEETHEADER));
+ psh.dwSize=sizeof(PROPSHEETHEADER);
+ psh.dwFlags=PSH_WIZARD;
+ psh.phpage=hpsp;
+ psh.hwndParent=hwnd;
+ psh.nPages=MAX_NEWPROJECTPAGE;
+ PropertySheet(&psh);
+}
+
+#define CATEGORY_TEXT_BASIC "Basic"
+#define CATEGORY_TEXT_TEXT "テキスト"
+#define CATEGORY_TEXT_OTHER "その他"
+
+#define CATEGORY_BASIC 1
+#define CATEGORY_TEXT 2
+#define CATEGORY_OTHER 3
+void ResetNewFileTypeListView(HWND hListView,int fCategory){
+ ListView_DeleteAllItems(hListView);
+
+ LV_ITEM lvItem;
+ lvItem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
+ lvItem.iItem=0;
+ lvItem.iSubItem=0;
+
+ if(fCategory==CATEGORY_BASIC){
+ lvItem.pszText="Basic ソース ファイル";
+ lvItem.iImage=0;
+ lvItem.lParam=FT_BASICPROGRAM;
+ ListView_InsertItem(hListView,&lvItem);
+ lvItem.iItem++;
+
+ lvItem.pszText="プロジェクト";
+ lvItem.iImage=2;
+ lvItem.lParam=FT_PROJECT;
+ ListView_InsertItem(hListView,&lvItem);
+ }
+ else if(fCategory==CATEGORY_TEXT){
+ lvItem.pszText="テキスト ファイル";
+ lvItem.iImage=3;
+ lvItem.lParam=FT_TEXT;
+ ListView_InsertItem(hListView,&lvItem);
+ lvItem.iItem++;
+
+ lvItem.pszText="HTML ファイル";
+ lvItem.iImage=4;
+ lvItem.lParam=FT_HTML;
+ ListView_InsertItem(hListView,&lvItem);
+ }
+ else if(fCategory==CATEGORY_OTHER){
+ lvItem.pszText="アイコン ファイル";
+ lvItem.iImage=5;
+ lvItem.lParam=FT_ICON;
+ ListView_InsertItem(hListView,&lvItem);
+ }
+
+ ListView_SetItemState(hListView,0,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
+}
+
+#ifndef THETEXT
+BOOL CALLBACK DlgNewFile(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern PROJECTINFO ProjectInfo;
+ extern char NewFileName[MAX_PATH];
+
+ static HIMAGELIST hImageList;
+ static HWND hTree;
+ static HWND hListView;
+ int i;
+ LVITEM lvItem;
+ switch(message){
+ case WM_INITDIALOG:
+ SetPosCenter(hwnd);
+
+
+ ///////////////////////////////////
+ // カテゴリツリービューを初期化
+ ///////////////////////////////////
+ HTREEITEM hBasicTreeItem;
+
+ hTree=GetDlgItem(hwnd,IDC_CATEGORY_TREE);
+
+ TV_INSERTSTRUCT tv;
+ tv.hInsertAfter=TVI_LAST;
+ tv.item.mask=TVIF_TEXT;
+ tv.hParent=TVI_ROOT;
+
+ tv.item.pszText=CATEGORY_TEXT_BASIC;
+ hBasicTreeItem=TreeView_InsertItem(hTree,&tv);
+ tv.item.pszText=CATEGORY_TEXT_TEXT;
+ TreeView_InsertItem(hTree,&tv);
+ tv.item.pszText=CATEGORY_TEXT_OTHER;
+ TreeView_InsertItem(hTree,&tv);
+
+ TreeView_SelectItem(hTree,hBasicTreeItem);
+
+
+
+ /////////////////////////////////////////
+ // ファイルタイプ リストビューを初期化
+ /////////////////////////////////////////
+
+ hListView=GetDlgItem(hwnd,IDC_FILETYPELIST);
+
+ hImageList=ImageList_Create(32, 32, ILC_COLOR24|ILC_MASK, 6, 0);
+ ListView_SetImageList(hListView, hImageList, LVSIL_NORMAL);
+ ImageList_AddIcon(hImageList, LoadIcon(hInst, MAKEINTRESOURCE(IDI_FILE_BAS)));
+ ImageList_AddIcon(hImageList, LoadIcon(hInst, MAKEINTRESOURCE(IDI_FILE_SBP)));
+ ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_NEWFILE_PJ)));
+ ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_NEWFILE_TEXT)));
+ ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_NEWFILE_HTML)));
+ ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_NEWFILE_ICON)));
+
+
+ ResetNewFileTypeListView(hListView,CATEGORY_BASIC);
+
+
+ SetFocus(GetDlgItem(hwnd,IDC_FILETYPELIST));
+
+ if(ProjectInfo.name[0]){
+ SendDlgItemMessage(hwnd,IDC_ADDTOPROJECT,BM_SETCHECK,BST_CHECKED,0);
+ }
+
+ SendMessage(hwnd,WM_COMMAND,IDC_ADDTOPROJECT,0);
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDOK:
+ for(i=0;ihwndFrom==hTree&&hdr->code==TVN_SELCHANGED){
+ NMTREEVIEW *lpnmTree;
+ lpnmTree=(NMTREEVIEW *)lParam;
+
+ char temporary[255];
+ TVITEM tvItem;
+ tvItem.mask=TVIF_TEXT|TVIF_HANDLE;
+ tvItem.hItem=lpnmTree->itemNew.hItem;
+ tvItem.pszText=temporary;
+ tvItem.cchTextMax=255;
+ TreeView_GetItem(hTree,&tvItem);
+
+ if(lstrcmpi(tvItem.pszText,CATEGORY_TEXT_BASIC)==0)
+ ResetNewFileTypeListView(hListView,CATEGORY_BASIC);
+ else if(lstrcmpi(tvItem.pszText,CATEGORY_TEXT_TEXT)==0)
+ ResetNewFileTypeListView(hListView,CATEGORY_TEXT);
+ else if(lstrcmpi(tvItem.pszText,CATEGORY_TEXT_OTHER)==0)
+ ResetNewFileTypeListView(hListView,CATEGORY_OTHER);
+ }
+ if(hdr->hwndFrom==hListView){
+ if(hdr->code==LVN_ITEMCHANGED){
+ for(i=0;icode==NM_DBLCLK){
+ SendMessage(hwnd,WM_COMMAND,IDOK,0);
+ }
+ }
+ return 0;
+
+ case WM_DESTROY:
+ ImageList_Destroy(hImageList);
+ return 0;
+ }
+ return 0;
+}
+#endif
+
+
+//プロジェクトオプション項目
+#define MAX_PJSETDLG 4
+DWORD temp_dwPjOption;
+char temp_lpszOutputRelease[MAX_PATH];
+char temp_lpszOutputDebug[MAX_PATH];
+char temp_szManifestPath[MAX_PATH];
+char temp_szDebugCmdLine[8192];
+char temp_szDebugExePath[MAX_PATH];
+
+void SaveSetting_DlgPjOption(void){
+ extern PROJECTINFO ProjectInfo;
+ if(SetSwitch[0]){
+ //出力ファイル
+ lstrcpy(ProjectInfo.lpszOutput_Release,temp_lpszOutputRelease);
+ lstrcpy(ProjectInfo.lpszOutput_Debug,temp_lpszOutputDebug);
+
+ //コメントの有無
+ ProjectInfo.dwOption=temp_dwPjOption;
+ }
+ if(SetSwitch[1]){
+ //Win32API
+ ProjectInfo.dwOption=temp_dwPjOption;
+ }
+ if(SetSwitch[2]){
+ //マニフェスト
+
+ //パス
+ lstrcpy(ProjectInfo.szManifestPath,temp_szManifestPath);
+
+ ProjectInfo.dwOption=temp_dwPjOption;
+
+ ProjectInfo.ModifuOfResource=1;
+ }
+ if(SetSwitch[3]){
+ //デバッグ
+
+ //コマンドライン
+ lstrcpy(ProjectInfo.szCmdLine,temp_szDebugCmdLine);
+
+ //デバッグセッション用の実行可能ファイル
+ lstrcpy(ProjectInfo.szExePath,temp_szDebugExePath);
+ }
+
+ ProjectInfo.modify=1;
+}
+BOOL CALLBACK DlgProjectOption_Whole(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern PROJECTINFO ProjectInfo;
+ NMHDR *nmhdr;
+
+ switch(message){
+ case WM_INITDIALOG:
+ SetPosCenter(GetParent(hwnd));
+
+ SetSwitch[0]=1;
+
+ //出力ファイル
+ SetDlgItemText(hwnd,IDC_EDIT_RELEASE,ProjectInfo.lpszOutput_Release);
+ SetDlgItemText(hwnd,IDC_EDIT_DEBUG,ProjectInfo.lpszOutput_Debug);
+
+ //厳密な型チェック
+ if(temp_dwPjOption&PJ_OP_STRICT)
+ SendDlgItemMessage(hwnd,IDC_STRICT,BM_SETCHECK,BST_CHECKED,0);
+
+ break;
+ case WM_NOTIFY:
+ nmhdr=(NMHDR *)lParam;
+ if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+ GetDlgItemText(hwnd,IDC_EDIT_RELEASE,temp_lpszOutputRelease,MAX_PATH);
+ GetDlgItemText(hwnd,IDC_EDIT_DEBUG,temp_lpszOutputDebug,MAX_PATH);
+
+ //厳密な型チェック
+ if(SendDlgItemMessage(hwnd,IDC_STRICT,BM_GETCHECK,0,0))
+ temp_dwPjOption|=PJ_OP_STRICT;
+ else temp_dwPjOption&=~PJ_OP_STRICT;
+
+ if(nmhdr->code==PSN_APPLY) SaveSetting_DlgPjOption();
+ }
+ return 1;
+ }
+ return 0;
+}
+BOOL CALLBACK DlgProjectOption_Win32API(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern PROJECTINFO ProjectInfo;
+ NMHDR *nmhdr;
+
+ switch(message){
+ case WM_INITDIALOG:
+ SetSwitch[1]=1;
+
+ if(temp_dwPjOption&PJ_OP_MMSYSTEM)
+ SendDlgItemMessage(hwnd,IDC_API_MMSYS,BM_SETCHECK,BST_CHECKED,0);
+ if(temp_dwPjOption&PJ_OP_COMMCTRL)
+ SendDlgItemMessage(hwnd,IDC_API_COMMCTRL,BM_SETCHECK,BST_CHECKED,0);
+ if(temp_dwPjOption&PJ_OP_RICHEDIT)
+ SendDlgItemMessage(hwnd,IDC_API_RICHEDIT,BM_SETCHECK,BST_CHECKED,0);
+ if(temp_dwPjOption&PJ_OP_WINSOCK)
+ SendDlgItemMessage(hwnd,IDC_API_WINSOCK,BM_SETCHECK,BST_CHECKED,0);
+ break;
+ case WM_NOTIFY:
+ nmhdr=(NMHDR *)lParam;
+ if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+ if(SendDlgItemMessage(hwnd,IDC_API_MMSYS,BM_GETCHECK,0,0))
+ temp_dwPjOption|=PJ_OP_MMSYSTEM;
+ else temp_dwPjOption&=~PJ_OP_MMSYSTEM;
+ if(SendDlgItemMessage(hwnd,IDC_API_COMMCTRL,BM_GETCHECK,0,0))
+ temp_dwPjOption|=PJ_OP_COMMCTRL;
+ else temp_dwPjOption&=~PJ_OP_COMMCTRL;
+ if(SendDlgItemMessage(hwnd,IDC_API_RICHEDIT,BM_GETCHECK,0,0))
+ temp_dwPjOption|=PJ_OP_RICHEDIT;
+ else temp_dwPjOption&=~PJ_OP_RICHEDIT;
+ if(SendDlgItemMessage(hwnd,IDC_API_WINSOCK,BM_GETCHECK,0,0))
+ temp_dwPjOption|=PJ_OP_WINSOCK;
+ else temp_dwPjOption&=~PJ_OP_WINSOCK;
+
+ if(nmhdr->code==PSN_APPLY) SaveSetting_DlgPjOption();
+ }
+ return 1;
+ }
+ return 0;
+}
+BOOL CALLBACK DlgProjectOption_Manifest(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ switch(message){
+ case WM_INITDIALOG:
+ SetSwitch[2]=1;
+
+ //パス
+ SetDlgItemText(hwnd,IDC_PATH,ProjectInfo.szManifestPath);
+
+ //マニフェストをリソースに埋め込む
+ if(temp_dwPjOption&PJ_OP_RC_MANIFEST)
+ SendDlgItemMessage(hwnd,IDC_RC_MANIFEST,BM_SETCHECK,BST_CHECKED,0);
+
+ SendMessage(hwnd,WM_COMMAND,IDC_RC_MANIFEST,0);
+
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDC_RC_MANIFEST:
+ if(SendDlgItemMessage(hwnd,IDC_RC_MANIFEST,BM_GETCHECK,0,0)){
+ EnableWindow(GetDlgItem(hwnd,IDC_STATIC_PATH),1);
+ EnableWindow(GetDlgItem(hwnd,IDC_PATH),1);
+ }
+ else{
+ EnableWindow(GetDlgItem(hwnd,IDC_STATIC_PATH),0);
+ EnableWindow(GetDlgItem(hwnd,IDC_PATH),0);
+ }
+ return 1;
+ }
+ break;
+ case WM_NOTIFY:
+ NMHDR *nmhdr;
+ nmhdr=(NMHDR *)lParam;
+ if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+
+ //パス
+ GetDlgItemText(hwnd,IDC_PATH,temp_szManifestPath,MAX_PATH);
+
+ //マニフェストをリソースに埋め込む
+ if(SendDlgItemMessage(hwnd,IDC_RC_MANIFEST,BM_GETCHECK,0,0))
+ temp_dwPjOption|=PJ_OP_RC_MANIFEST;
+ else temp_dwPjOption&=~PJ_OP_RC_MANIFEST;
+
+ if(nmhdr->code==PSN_APPLY) SaveSetting_DlgPjOption();
+ }
+ return 1;
+ }
+ return 0;
+}
+BOOL CALLBACK DlgProjectOption_Debug(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern PROJECTINFO ProjectInfo;
+ NMHDR *nmhdr;
+ char temporary[MAX_PATH];
+
+ switch(message){
+ case WM_INITDIALOG:
+ SetSwitch[3]=1;
+
+ if(ProjectInfo.dwModuleType!=MT_DLL){
+ EnableWindow(GetDlgItem(hwnd,IDC_EXE_PATH),0);
+ EnableWindow(GetDlgItem(hwnd,IDC_DIR),0);
+ }
+
+ SetDlgItemText(hwnd,IDC_CMD_LINE,ProjectInfo.szCmdLine);
+ SetDlgItemText(hwnd,IDC_EXE_PATH,ProjectInfo.szExePath);
+
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDC_DIR:
+ extern LPSTR ExeFileFilter;
+ if(!GetFilePathDialog(hwnd,temporary,ExeFileFilter,"DLLデバッグ用の実行可能ファイルを指定してください",1)) break;
+
+ SetDlgItemText(hwnd,IDC_EXE_PATH,temporary);
+ return 1;
+ }
+ break;
+ case WM_NOTIFY:
+ nmhdr=(NMHDR *)lParam;
+ if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+ GetDlgItemText(hwnd,IDC_CMD_LINE,temp_szDebugCmdLine,8192);
+ GetDlgItemText(hwnd,IDC_EXE_PATH,temp_szDebugExePath,MAX_PATH);
+
+ if(nmhdr->code==PSN_APPLY) SaveSetting_DlgPjOption();
+ }
+ return 1;
+ }
+ return 0;
+}
+void DlgProjectOptionSetting(HWND hwnd){
+ PROPSHEETHEADER psh;
+ PROPSHEETPAGE psp[MAX_PJSETDLG];
+ HPROPSHEETPAGE hpsp[MAX_PJSETDLG];
+ int i;
+ memset(&SetSwitch,0,MAX_PJSETDLG);
+
+ //各ページのセッティング
+ i=0;
+ psp[i].dwSize=sizeof(PROPSHEETPAGE);
+ psp[i].dwFlags=PSP_DEFAULT;
+ psp[i].hInstance=hResInst;
+ psp[i].pszTemplate=MAKEINTRESOURCE(IDD_PJ_OPTION1);
+ psp[i].pfnDlgProc=DlgProjectOption_Whole;
+ hpsp[i]=CreatePropertySheetPage(&psp[i]);
+ i++;
+ psp[i].dwSize=sizeof(PROPSHEETPAGE);
+ psp[i].dwFlags=PSP_DEFAULT;
+ psp[i].hInstance=hResInst;
+ psp[i].pszTemplate=MAKEINTRESOURCE(IDD_PJ_OPTION2);
+ psp[i].pfnDlgProc=DlgProjectOption_Win32API;
+ hpsp[i]=CreatePropertySheetPage(&psp[i]);
+ i++;
+ psp[i].dwSize=sizeof(PROPSHEETPAGE);
+ psp[i].dwFlags=PSP_DEFAULT;
+ psp[i].hInstance=hResInst;
+ psp[i].pszTemplate=MAKEINTRESOURCE(IDD_PJ_OPTION3);
+ psp[i].pfnDlgProc=DlgProjectOption_Manifest;
+ hpsp[i]=CreatePropertySheetPage(&psp[i]);
+ i++;
+ psp[i].dwSize=sizeof(PROPSHEETPAGE);
+ psp[i].dwFlags=PSP_DEFAULT;
+ psp[i].hInstance=hResInst;
+ psp[i].pszTemplate=MAKEINTRESOURCE(IDD_PJ_OPTION4);
+ psp[i].pfnDlgProc=DlgProjectOption_Debug;
+ hpsp[i]=CreatePropertySheetPage(&psp[i]);
+
+ extern PROJECTINFO ProjectInfo;
+ temp_dwPjOption=ProjectInfo.dwOption;
+
+ memset(&psh,0,sizeof(PROPSHEETHEADER));
+ psh.dwSize=sizeof(PROPSHEETHEADER);
+ psh.dwFlags=PSH_PROPSHEETPAGE|PSH_NOAPPLYNOW;
+ psh.phpage=hpsp;
+ psh.hwndParent=hwnd;
+ psh.pszCaption=STRING_PROJECTOPTION; //"プロジェクト オプション"
+ psh.nPages=MAX_PJSETDLG;
+ psh.nStartPage=0;
+ psh.ppsp=psp;
+ PropertySheet(&psh);
+}
+
+
+/////////////////////
+// オプション項目
+/////////////////////
+
+BOOL bOptionWhole;
+BOOL bOptionEditor;
+BOOL bOptionColor;
+BOOL bOptionToolbar;
+BOOL bOptionRad;
+BOOL bOptionWeb;
+BOOL temp_bSaveCheckProject;
+BOOL temp_bLineAdjust;
+BOOL temp_bSaveTabToHead;
+LOGFONT temp_lf,temp_HintFont;
+int temp_TabSize;
+BOOL temp_bEditor_LineNumber;
+BOOL temp_bEditor_Ruler;
+BOOL temp_bEditor_CaretLine_BackGround;
+int temp_iMaxOneLineTextLength;
+BOOL temp_bAutoIndent;
+BOOL temp_bPasteIndent;
+DWORD temp_dwParameterHint;
+BOOL temp_bShowComplementWnd;
+int temp_BackNum_PairStatementComplement;
+BOOL temp_bSaveFindStr;
+
+CTheme obj_temp_Theme;
+
+BOOL temp_bCtrlKeyHyperLink;
+BOOL temp_bSaveWebFindStr;
+CDBDomain *pobj_temp_DBDomain;
+
+void SaveSetting(void){
+ int i;
+ if(bOptionWhole){
+ //実行時の、プロジェクトの保存確認の有無
+ pobj_nv->bSaveCheckProject=temp_bSaveCheckProject;
+
+ //ドキュメントを保存したときにタブを先頭に再配置するかどうか
+ pobj_nv->bSaveTabToHead=temp_bSaveTabToHead;
+ }
+ if(bOptionEditor){
+ //フォント
+ pobj_nv->lf=temp_lf;
+
+ //タブサイズ
+ pobj_nv->TabSize=temp_TabSize;
+
+ //エディタの行番号を表示するかどうか
+ pobj_nv->bEditor_LineNumber=temp_bEditor_LineNumber;
+
+ //エディタのルーラーを表示するかどうか
+ pobj_nv->bEditor_Ruler=temp_bEditor_Ruler;
+
+ //カーソル行を強調表示するかどうか
+ pobj_nv->bEditor_CaretLine_BackGround=temp_bEditor_CaretLine_BackGround;
+
+ //自動折り返し時の一行あたりの文字数
+ pobj_nv->iMaxOneLineTextLength=temp_iMaxOneLineTextLength;
+
+ //コード補完機能
+ pobj_nv->bShowComplementWnd=temp_bShowComplementWnd;
+
+ pobj_nv->BackNum_PairStatementComplement=temp_BackNum_PairStatementComplement;
+
+ //パラメータ ヒント
+ pobj_nv->dwParameterHint=temp_dwParameterHint;
+
+ //パラメータ ヒント フォント
+ extern METHODCHECKINFO MethodCheckInfo;
+ MethodCheckInfo.LogFont=temp_HintFont;
+ DeleteObject(MethodCheckInfo.hFont);
+ DeleteObject(MethodCheckInfo.hBoldFont);
+
+ MethodCheckInfo.hFont=CreateFontIndirect(&MethodCheckInfo.LogFont);
+ i=MethodCheckInfo.LogFont.lfWeight;
+ MethodCheckInfo.LogFont.lfWeight=FW_BOLD;
+ MethodCheckInfo.hBoldFont=CreateFontIndirect(&MethodCheckInfo.LogFont);
+ MethodCheckInfo.LogFont.lfWeight=i;
+
+ //自動インデント
+ pobj_nv->bAutoIndent=temp_bAutoIndent;
+
+ //貼り付け時のインデント調整
+ pobj_nv->bPasteIndent=temp_bPasteIndent;
+
+ //検索・置換文字列を保存するかどうか
+ pobj_nv->bSaveFindStr=temp_bSaveFindStr;
+
+ RedrawAllWindow(); //すべてのウィンドウを再描画
+ }
+ if(bOptionColor){
+ //カラーデザインを更新
+ CTheme *pobj_Theme;
+ pobj_Theme=pobj_DBTheme->dupli_check(obj_temp_Theme.m_name);
+ *pobj_Theme=obj_temp_Theme;
+ if(lstrcmp(pobj_Theme->m_name,THEMENAME_USER)==0){
+ //ユーザー設定の場合は自動的にファイルに保存する
+ pobj_Theme->save();
+ }
+
+ //再描画
+ SetTextEditColorDesign(&tci,pobj_Theme,1);
+ }
+ if(bOptionRad){
+ //ライン アジャスタ
+ pobj_nv->bLineAdjust=temp_bLineAdjust;
+ }
+ if(bOptionWeb){
+ pobj_nv->bCtrlKeyHyperLink=temp_bCtrlKeyHyperLink;
+
+ pobj_nv->bSaveWebFindStr=temp_bSaveWebFindStr;
+
+ //Web検索
+ pobj_nv->pobj_DBDomain->copy_get(pobj_temp_DBDomain);
+
+ //SideWebウィンドウを再表示
+ delete pobj_SideWeb;
+ pobj_SideWeb=new CSideWeb(hOwner);
+ ResizeOwnerWnd();
+ }
+ return;
+}
+BOOL CALLBACK Dlg_Option_Whole(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ NMHDR *nmhdr;
+ switch(message){
+ case WM_INITDIALOG:
+ SetPosCenter(GetParent(hwnd));
+
+ bOptionWhole=1;
+
+ //実行時の、プロジェクトの保存確認の有無
+ if(pobj_nv->bSaveCheckProject) SendDlgItemMessage(hwnd,IDC_SAVECHECK,BM_SETCHECK,BST_CHECKED,0);
+
+ //ドキュメントを保存したときにタブを先頭に再配置するかどうか
+ if(pobj_nv->bSaveTabToHead) SendDlgItemMessage(hwnd,IDC_SAVE_TAB_TO_HEAD,BM_SETCHECK,BST_CHECKED,0);
+
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDC_LINKFILE:
+ ExtensionLink(hwnd);
+ return 1;
+ }
+ break;
+ case WM_NOTIFY:
+ nmhdr=(NMHDR *)lParam;
+ if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+ //実行時の、プロジェクトの保存確認の有無
+ if(SendDlgItemMessage(hwnd,IDC_SAVECHECK,BM_GETCHECK,0,0)) temp_bSaveCheckProject=1;
+ else temp_bSaveCheckProject=0;
+
+ //ドキュメントを保存したときにタブを先頭に再配置するかどうか
+ if(SendDlgItemMessage(hwnd,IDC_SAVE_TAB_TO_HEAD,BM_GETCHECK,0,0)) temp_bSaveTabToHead=1;
+ else temp_bSaveTabToHead=0;
+
+ if(nmhdr->code==PSN_APPLY) SaveSetting();
+ }
+ return 1;
+ case WM_HELP:
+ HELPINFO *lpHelpInfo;
+ lpHelpInfo = (HELPINFO *)lParam;
+
+ HH_POPUP hp;
+ memset(&hp, 0, sizeof(HH_POPUP));
+ hp.cbStruct = sizeof(HH_POPUP);
+ hp.pt.x = lpHelpInfo->MousePos.x;
+ hp.pt.y = lpHelpInfo->MousePos.y+10;
+ hp.clrForeground = RGB(0, 0, 0);
+ hp.clrBackground = -1;
+ hp.rcMargins.left = -1;
+ hp.rcMargins.right = -1;
+ hp.rcMargins.top = -1;
+ hp.rcMargins.bottom = -1;
+ hp.idString = 0;
+ hp.pszFont="MS Sans Serif,10";
+
+ switch(lpHelpInfo->iCtrlId){
+ case IDC_SAVECHECK:
+#if defined(JPN)
+ //日本語
+ hp.pszText="このチェックボックスをオンにすると、プロジェクトが未保存の状態であるとき、コンパイル時に保存確認のダイアログボックスが表示されるようになります。\nチェックをオフにすると、プロジェクトはコンパイル時に自動的に保存されます(デフォルトはオフです)。";
+#else
+ //英語
+ hp.pszText="When the compiling button is clicked, if this check is on, the DialogBox to save modification is displayed.\nIf this check is off, the project is saved automatically(Default).";
+#endif
+ break;
+ case IDC_LINKFILE:
+#if defined(JPN)
+ //日本語
+ hp.pszText="ファイルの関連付けを行います。";
+#else
+ //英語
+ hp.pszText="Relate the files.";
+#endif
+ break;
+ default:
+ hp.pszText="";
+ break;
+ }
+ HtmlHelp(hwnd, 0, HH_DISPLAY_TEXT_POPUP, (DWORD)&hp);
+ return 1;
+ }
+ return 0;
+}
+BOOL CALLBACK Dlg_Option_Editor(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ extern METHODCHECKINFO MethodCheckInfo;
+ char str[255];
+ NMHDR *nmhdr;
+ switch(message){
+ case WM_INITDIALOG:
+ bOptionEditor=1;
+
+ //フォント
+ sprintf(str,"%s",pobj_nv->lf.lfFaceName);
+ SetDlgItemText(hwnd,IDC_SETFONT,str);
+ temp_lf=pobj_nv->lf;
+
+ //タブサイズ
+ sprintf(str,"%d",pobj_nv->TabSize);
+ SetDlgItemText(hwnd,IDC_TABSIZE,str);
+
+ //エディタの行番号を表示するかどうか
+ if(pobj_nv->bEditor_LineNumber) SendDlgItemMessage(hwnd,IDC_LINENUMBER,BM_SETCHECK,BST_CHECKED,0);
+
+ //エディタのルーラーを表示するかどうか
+ if(pobj_nv->bEditor_Ruler) SendDlgItemMessage(hwnd,IDC_RULER,BM_SETCHECK,BST_CHECKED,0);
+
+ //カーソル行を強調表示するかどうか
+ if(pobj_nv->bEditor_CaretLine_BackGround) SendDlgItemMessage(hwnd,IDC_CARETLINE_BACKGROUND,BM_SETCHECK,BST_CHECKED,0);
+
+#ifdef THETEXT
+ //自動折り返し時の一行あたりの文字数
+ sprintf(str,"%d",pobj_nv->iMaxOneLineTextLength);
+ SetDlgItemText(hwnd,IDC_MAX_ONELINE_TEXT_LENGTH,str);
+#endif
+
+ //自動インデント
+ if(pobj_nv->bAutoIndent) SendDlgItemMessage(hwnd,IDC_ISAUTOINDENT,BM_SETCHECK,BST_CHECKED,0);
+
+ //貼り付け時のインデント調整
+ if(pobj_nv->bPasteIndent) SendDlgItemMessage(hwnd,IDC_PASTEINDENT,BM_SETCHECK,BST_CHECKED,0);
+
+ //コード補完
+ if(pobj_nv->bShowComplementWnd)
+ SendDlgItemMessage(hwnd,IDC_COMPLEMENT,BM_SETCHECK,BST_CHECKED,0);
+
+ //ペアステートメント補完
+ SendDlgItemMessage(hwnd,IDC_BACKNUM,EM_SETLIMITTEXT,4,0);
+ if(pobj_nv->BackNum_PairStatementComplement){
+ SendDlgItemMessage(hwnd,IDC_PAIRSTATEMENT,BM_SETCHECK,BST_CHECKED,0);
+ sprintf(str,"%d",pobj_nv->BackNum_PairStatementComplement);
+ SetDlgItemText(hwnd,IDC_BACKNUM,str);
+ }
+
+ SendMessage(hwnd,WM_COMMAND,IDC_COMPLEMENT,0);
+
+ //パラメータ ヒント
+ if(pobj_nv->dwParameterHint){
+ SendDlgItemMessage(hwnd,IDC_PARAMHINT,BM_SETCHECK,BST_CHECKED,0);
+ if(pobj_nv->dwParameterHint==1)
+ SendDlgItemMessage(hwnd,IDC_POPUP,BM_SETCHECK,BST_CHECKED,0);
+ else
+ SendDlgItemMessage(hwnd,IDC_STATUSBAR,BM_SETCHECK,BST_CHECKED,0);
+ SendMessage(hwnd,WM_COMMAND,IDC_PARAMHINT,0);
+ }
+ else SendDlgItemMessage(hwnd,IDC_POPUP,BM_SETCHECK,BST_CHECKED,0);
+
+ //パラメータ ヒント フォント
+ sprintf(str,"%s",MethodCheckInfo.LogFont.lfFaceName);
+ SetDlgItemText(hwnd,IDC_HINTFONT,str);
+ temp_HintFont=MethodCheckInfo.LogFont;
+
+ //検索・置換文字列を保存するかどうか
+ if(pobj_nv->bSaveFindStr) SendDlgItemMessage(hwnd,IDC_SAVE_FINDSTR,BM_SETCHECK,BST_CHECKED,0);
+
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDC_SETFONT:
+ if(!SetFontDialog(hwnd,&temp_lf,1)) return 1;
+ sprintf(str,"%s",temp_lf.lfFaceName);
+ SetDlgItemText(hwnd,IDC_SETFONT,str);
+ return 1;
+ case IDC_HINTFONT:
+ if(!SetFontDialog(hwnd,&temp_HintFont,0)) return 1;
+ sprintf(str,"%s",temp_HintFont.lfFaceName);
+ SetDlgItemText(hwnd,IDC_HINTFONT,str);
+ return 1;
+
+ case IDC_ISAUTOINDENT:
+ case IDC_COMPLEMENT:
+ if(SendDlgItemMessage(hwnd,IDC_ISAUTOINDENT,BM_GETCHECK,0,0)&&
+ SendDlgItemMessage(hwnd,IDC_COMPLEMENT,BM_GETCHECK,0,0)){
+ EnableWindow(GetDlgItem(hwnd,IDC_PAIRSTATEMENT),1);
+ SendMessage(hwnd,WM_COMMAND,IDC_PAIRSTATEMENT,0);
+ }
+ else{
+ EnableWindow(GetDlgItem(hwnd,IDC_PAIRSTATEMENT),0);
+ EnableWindow(GetDlgItem(hwnd,IDC_BACKNUM),0);
+ EnableWindow(GetDlgItem(hwnd,IDC_STATIC_PAIRSTATEMENT),0);
+ }
+ return 1;
+
+ case IDC_PAIRSTATEMENT:
+ if(SendDlgItemMessage(hwnd,IDC_PAIRSTATEMENT,BM_GETCHECK,0,0)){
+ EnableWindow(GetDlgItem(hwnd,IDC_BACKNUM),1);
+ EnableWindow(GetDlgItem(hwnd,IDC_STATIC_PAIRSTATEMENT),1);
+
+ if(GetWindowTextLength(GetDlgItem(hwnd,IDC_BACKNUM))==0)
+ SetDlgItemText(hwnd,IDC_BACKNUM,"100");
+ }
+ else{
+ EnableWindow(GetDlgItem(hwnd,IDC_BACKNUM),0);
+ EnableWindow(GetDlgItem(hwnd,IDC_STATIC_PAIRSTATEMENT),0);
+ }
+ return 1;
+
+ case IDC_PARAMHINT:
+ if(SendDlgItemMessage(hwnd,IDC_PARAMHINT,BM_GETCHECK,0,0)){
+ EnableWindow(GetDlgItem(hwnd,IDC_POPUP),1);
+ EnableWindow(GetDlgItem(hwnd,IDC_STATUSBAR),1);
+ if(SendDlgItemMessage(hwnd,IDC_POPUP,BM_GETCHECK,0,0)){
+ EnableWindow(GetDlgItem(hwnd,IDC_STATIC_HINTFONT),1);
+ EnableWindow(GetDlgItem(hwnd,IDC_HINTFONT),1);
+ }
+ }
+ else{
+ EnableWindow(GetDlgItem(hwnd,IDC_POPUP),0);
+ EnableWindow(GetDlgItem(hwnd,IDC_STATUSBAR),0);
+ EnableWindow(GetDlgItem(hwnd,IDC_STATIC_HINTFONT),0);
+ EnableWindow(GetDlgItem(hwnd,IDC_HINTFONT),0);
+ }
+ return 1;
+ case IDC_POPUP:
+ EnableWindow(GetDlgItem(hwnd,IDC_STATIC_HINTFONT),1);
+ EnableWindow(GetDlgItem(hwnd,IDC_HINTFONT),1);
+ return 1;
+ case IDC_STATUSBAR:
+ EnableWindow(GetDlgItem(hwnd,IDC_STATIC_HINTFONT),0);
+ EnableWindow(GetDlgItem(hwnd,IDC_HINTFONT),0);
+ return 1;
+ }
+ break;
+ case WM_NOTIFY:
+ nmhdr=(NMHDR *)lParam;
+ if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+ GetDlgItemText(hwnd,IDC_TABSIZE,str,255);
+ sscanf(str,"%d",&temp_TabSize);
+
+ //エディタの行番号を表示するかどうか
+ if(SendDlgItemMessage(hwnd,IDC_LINENUMBER,BM_GETCHECK,0,0)) temp_bEditor_LineNumber=1;
+ else temp_bEditor_LineNumber=0;
+
+ //エディタのルーラーを表示するかどうか
+ if(SendDlgItemMessage(hwnd,IDC_RULER,BM_GETCHECK,0,0)) temp_bEditor_Ruler=1;
+ else temp_bEditor_Ruler=0;
+
+ //カーソル行を強調表示するかどうか
+ if(SendDlgItemMessage(hwnd,IDC_CARETLINE_BACKGROUND,BM_GETCHECK,0,0)) temp_bEditor_CaretLine_BackGround=1;
+ else temp_bEditor_CaretLine_BackGround=0;
+
+#ifdef THETEXT
+ //自動折り返し時の一行あたりの文字数
+ GetDlgItemText(hwnd,IDC_MAX_ONELINE_TEXT_LENGTH,str,255);
+ sscanf(str,"%d",&temp_iMaxOneLineTextLength);
+ if(temp_iMaxOneLineTextLength<=0){
+ temp_iMaxOneLineTextLength=75;
+ }
+#endif
+
+ //自動インデント
+ if(SendDlgItemMessage(hwnd,IDC_ISAUTOINDENT,BM_GETCHECK,0,0)) temp_bAutoIndent=1;
+ else temp_bAutoIndent=0;
+
+ //貼り付け時のインデント調整
+ if(SendDlgItemMessage(hwnd,IDC_PASTEINDENT,BM_GETCHECK,0,0)) temp_bPasteIndent=1;
+ else temp_bPasteIndent=0;
+
+ //コード補完機能
+ if(SendDlgItemMessage(hwnd,IDC_COMPLEMENT,BM_GETCHECK,0,0))
+ temp_bShowComplementWnd=1;
+ else temp_bShowComplementWnd=0;
+
+ //ペアステートメント補完
+ if(IsWindowEnabled(GetDlgItem(hwnd,IDC_PAIRSTATEMENT))){
+ if(SendDlgItemMessage(hwnd,IDC_PAIRSTATEMENT,BM_GETCHECK,0,0)){
+ GetDlgItemText(hwnd,IDC_BACKNUM,str,255);
+ sscanf(str,"%d",&temp_BackNum_PairStatementComplement);
+ }
+ else temp_BackNum_PairStatementComplement=0;
+ }
+ else temp_BackNum_PairStatementComplement=0;
+
+ //パラメータヒント
+ if(SendDlgItemMessage(hwnd,IDC_PARAMHINT,BM_GETCHECK,0,0)){
+ if(SendDlgItemMessage(hwnd,IDC_POPUP,BM_GETCHECK,0,0)) temp_dwParameterHint=1;
+ else temp_dwParameterHint=2;
+ }
+ else temp_dwParameterHint=0;
+
+ if(SendDlgItemMessage(hwnd,IDC_SAVE_FINDSTR,BM_GETCHECK,0,0))
+ temp_bSaveFindStr=1;
+ else temp_bSaveFindStr=0;
+
+ if(nmhdr->code==PSN_APPLY) SaveSetting();
+ }
+ return 1;
+
+ case WM_HELP:
+ HELPINFO *lpHelpInfo;
+ lpHelpInfo = (HELPINFO *)lParam;
+
+ HH_POPUP hp;
+ memset(&hp, 0, sizeof(HH_POPUP));
+ hp.cbStruct = sizeof(HH_POPUP);
+ hp.pt.x = lpHelpInfo->MousePos.x;
+ hp.pt.y = lpHelpInfo->MousePos.y+10;
+ hp.clrForeground = RGB(0, 0, 0);
+ hp.clrBackground = -1;
+ hp.rcMargins.left = -1;
+ hp.rcMargins.right = -1;
+ hp.rcMargins.top = -1;
+ hp.rcMargins.bottom = -1;
+ hp.idString = 0;
+ hp.pszFont="MS Sans Serif,10";
+
+ switch(lpHelpInfo->iCtrlId){
+ case IDC_STATIC_SETFONT:
+ case IDC_SETFONT:
+#if defined(JPN)
+ //日本語
+ hp.pszText="エディタで使用するフォントを選択することができます。";
+#else
+ //英語
+ hp.pszText="Choose the font displayed on the editor";
+#endif
+ break;
+ case IDC_STATIC_TABSIZE:
+ case IDC_TABSIZE:
+#if defined(JPN)
+ //日本語
+ hp.pszText="タブサイズを指定します。デフォルト値は4です。";
+#else
+ //英語
+ hp.pszText="Set the tab size. Value of default is 4.";
+#endif
+ break;
+ case IDC_ISAUTOINDENT:
+#if defined(JPN)
+ //日本語
+ hp.pszText="このチェックをオンにすると、必要に応じて、自動的にインデント用のタブ文字が挿入されます。";
+#else
+ //英語
+ hp.pszText="If this check is on, the indent tabs will be inserted automatically.";
+#endif
+ break;
+ case IDC_COMPLEMENT:
+#if defined(JPN)
+ //日本語
+ hp.pszText="このチェックをオンにすると、クラスまたは構造体のメンバを入力するときに、予想されるキーワードがリスト表示されます。";
+#else
+ //英語
+ hp.pszText="If this check is on, the member expected is displayed in a list when inputting the member of the class object.";
+#endif
+ break;
+ case IDC_PARAMHINT:
+#if defined(JPN)
+ //日本語
+ hp.pszText="このチェックをオンにすると、関数またはステートメントを入力するときに、該当するパラメータのヒント文字列が表示されます。文字列の表示方法はポップアップまたはステータスバーのいずれかを選択することができます。";
+#else
+ //英語
+ hp.pszText="If this check is on, parameter hint is displayed when inputting a function or a statement.";
+#endif
+ break;
+ case IDC_POPUP:
+#if defined(JPN)
+ //日本語
+ hp.pszText="パラメータヒントをポップアップ表示するときは、ここをチェックします。";
+#else
+ //英語
+ hp.pszText="If this check is on, parameter hint is displayed on a popup window.";
+#endif
+ break;
+ case IDC_STATUSBAR:
+#if defined(JPN)
+ //日本語
+ hp.pszText="パラメータヒントをステータスバーに表示するときは、ここをチェックします。";
+#else
+ //英語
+ hp.pszText="If this check is on, parameter hint is displayed in a status bar.";
+#endif
+ break;
+ case IDC_STATIC_HINTFONT:
+ case IDC_HINTFONT:
+#if defined(JPN)
+ //日本語
+ hp.pszText="ポップアップ表示されるパラメータヒントのフォントを指定します。";
+#else
+ //英語
+ hp.pszText="Choose the font displayed on the popup hint.";
+#endif
+ break;
+ default:
+ hp.pszText="";
+ break;
+ }
+ HtmlHelp(hwnd, 0, HH_DISPLAY_TEXT_POPUP, (DWORD)&hp);
+ return 1;
+ }
+ return 0;
+}
+COLORREF GetColorFromSelection(int iPos,TEXTEDIT_COLOR_INFO *ptci){
+ if(iPos==0) return ptci->rgbComment;
+ else if(iPos==1) return ptci->rgbString;
+ else if(iPos==2) return ptci->rgbDefault;
+ else if(iPos==3) return ptci->rgbStatement;
+ else if(iPos==4) return ptci->rgbCursorBack;
+ else if(iPos==5) return ptci->rgbBackground;
+ return 0;
+}
+void SetColorFromSelection(int iPos,COLORREF rgb,TEXTEDIT_COLOR_INFO *ptci){
+ if(iPos==0) ptci->rgbComment=rgb;
+ else if(iPos==1) ptci->rgbString=rgb;
+ else if(iPos==2) ptci->rgbDefault=rgb;
+ else if(iPos==3) ptci->rgbStatement=rgb;
+ else if(iPos==4) ptci->rgbCursorBack=rgb;
+ else if(iPos==5) ptci->rgbBackground=rgb;
+}
+#ifdef THETEXT
+char szNewThemeName[MAX_PATH];
+BOOL bThemeOverwirte;
+BOOL CALLBACK DlgOptionThemeSave(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ switch(message){
+ case WM_INITDIALOG:
+ SetPosCenter(hwnd);
+
+ SendMessage(hwnd,WM_COMMAND,IDC_NAME,0);
+ SetFocus(GetDlgItem(hwnd,IDC_NAME));
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDOK:
+ GetDlgItemText(hwnd,IDC_NAME,szNewThemeName,MAX_PATH);
+
+ if(SendDlgItemMessage(hwnd,IDC_OVERWRITE,BM_GETCHECK,0,0))
+ bThemeOverwirte=1;
+ else bThemeOverwirte=0;
+
+ if(pobj_DBTheme->dupli_check(szNewThemeName)){
+ if(!bThemeOverwirte){
+ char temporary[MAX_PATH];
+ sprintf(temporary,"テーマ \"%s\" は既に存在します。「上書きを許可する」をチェックした後、保存してください。",szNewThemeName);
+ MessageBox(hwnd,temporary,APPLICATION_NAME,MB_OK);
+ return 1;
+ }
+ }
+
+ EndDialog(hwnd,1);
+ return 1;
+ case IDCANCEL:
+ EndDialog(hwnd,0);
+ return 1;
+ case IDC_NAME:
+ if(GetWindowTextLength(GetDlgItem(hwnd,IDC_NAME)))
+ EnableWindow(GetDlgItem(hwnd,IDOK),1);
+ else EnableWindow(GetDlgItem(hwnd,IDOK),0);
+ return 1;
+ }
+ break;
+ }
+ return 0;
+}
+#endif
+BOOL CALLBACK Dlg_Option_Color(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ int iPos;
+ CTheme *pobj_Theme;
+ char temporary[MAX_PATH];
+ switch(message){
+ case WM_INITDIALOG:
+ bOptionColor=1;
+
+ //一時保存値を初期化
+ pobj_Theme=pobj_DBTheme->GetActiveTheme();
+ obj_temp_Theme=*pobj_Theme;
+
+ //指定する部分
+ SendDlgItemMessage(hwnd,IDC_TARGET,CB_ADDSTRING,0,(LPARAM)"コメント");
+ SendDlgItemMessage(hwnd,IDC_TARGET,CB_ADDSTRING,0,(LPARAM)"ダブルクォート内の文字列");
+ SendDlgItemMessage(hwnd,IDC_TARGET,CB_ADDSTRING,0,(LPARAM)"通常の文字");
+ SendDlgItemMessage(hwnd,IDC_TARGET,CB_ADDSTRING,0,(LPARAM)"特殊ステートメント");
+ SendDlgItemMessage(hwnd,IDC_TARGET,CB_ADDSTRING,0,(LPARAM)"背景色(カーソル行)");
+ SendDlgItemMessage(hwnd,IDC_TARGET,CB_ADDSTRING,0,(LPARAM)"背景色(一般)");
+ SendDlgItemMessage(hwnd,IDC_TARGET,CB_SETCURSEL,0,0);
+
+
+ //テーマ名をコンボボックスにセット
+ pobj_DBTheme->ResetTheme_ToComboBox(GetDlgItem(hwnd,IDC_THEME));
+
+
+ SendMessage(hwnd,WM_COMMAND,MAKELONG(IDC_THEME,CBN_SELCHANGE),0);
+ break;
+
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+#ifdef THETEXT
+ case IDC_SAVE:
+ if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_OPTION_THEME_SAVE),hwnd,DlgOptionThemeSave)) return 1;
+
+ pobj_Theme=pobj_DBTheme->dupli_check(szNewThemeName);
+ if(pobj_Theme){
+ }
+ else{
+ //新規に追加
+ pobj_Theme=pobj_DBTheme->add(0,szNewThemeName);
+ }
+ *pobj_Theme=obj_temp_Theme;
+ lstrcpy(pobj_Theme->m_name,szNewThemeName);
+
+ //ファイルに保存
+ pobj_Theme->save();
+
+ //テーマ コンボボックスのカーソル位置をセット
+ ComboBox_SetSelText(GetDlgItem(hwnd,IDC_THEME),szNewThemeName);
+
+ return 1;
+#endif //THETEXT
+ case IDC_THEME:
+ if(HIWORD(wParam)==CBN_SELCHANGE){
+ if(!SendDlgItemMessage(hwnd,IDC_THEME,CB_GETLBTEXT,
+ SendDlgItemMessage(hwnd,IDC_THEME,CB_GETCURSEL,0,0),
+ (LPARAM)temporary)) return 1;
+
+ pobj_Theme=pobj_DBTheme->dupli_check(temporary);
+ obj_temp_Theme=*pobj_Theme;
+
+ InvalidateRect(GetDlgItem(hwnd,IDC_SAMPLE),NULL,0);
+ InvalidateRect(GetDlgItem(hwnd,IDC_COLOR_BUTTON),NULL,0);
+ }
+ return 1;
+ case IDC_TARGET:
+ if(HIWORD(wParam)==CBN_SELCHANGE){
+ InvalidateRect(GetDlgItem(hwnd,IDC_COLOR_BUTTON),NULL,0);
+ }
+ return 1;
+ case IDC_COLOR_BUTTON:
+ iPos=SendDlgItemMessage(hwnd,IDC_TARGET,CB_GETCURSEL,0,0);
+
+ CHOOSECOLOR cc;
+ static COLORREF CustColors[16];
+ cc.lStructSize=sizeof(CHOOSECOLOR);
+ cc.hwndOwner=hwnd;
+ cc.rgbResult=GetColorFromSelection(iPos,&obj_temp_Theme.TextColorInfo);
+ cc.lpCustColors=CustColors;
+ cc.Flags=CC_FULLOPEN | CC_RGBINIT;
+ if(!ChooseColor(&cc)) return 1;
+
+ SetColorFromSelection(iPos,cc.rgbResult,&obj_temp_Theme.TextColorInfo);
+
+ InvalidateRect(GetDlgItem(hwnd,IDC_COLOR_BUTTON),NULL,0);
+ InvalidateRect(GetDlgItem(hwnd,IDC_SAMPLE),NULL,0);
+
+ lstrcpy(obj_temp_Theme.m_name,THEMENAME_USER);
+
+ //ユーザー設定を選択
+ ComboBox_SetSelText(GetDlgItem(hwnd,IDC_THEME),THEMENAME_USER);
+ return 1;
+ }
+ break;
+
+ case WM_NOTIFY:
+ NMHDR *nmhdr;
+ nmhdr=(NMHDR *)lParam;
+
+ if(nmhdr->code==PSN_APPLY) SaveSetting();
+ return 1;
+
+ case WM_DRAWITEM:
+ LPDRAWITEMSTRUCT pds;
+ pds=(LPDRAWITEMSTRUCT)lParam;
+
+ HBRUSH hBrush,hOldBrush;
+
+ if(wParam==IDC_COLOR_BUTTON){
+ iPos=SendDlgItemMessage(hwnd,IDC_TARGET,CB_GETCURSEL,0,0);
+
+ //////////////
+ // 色を描画
+ //////////////
+
+ //ペンとブラシを生成
+ HPEN hPen,hOldPen;
+ hPen=(HPEN)GetStockObject(WHITE_PEN);
+ if(IsWindowEnabled(GetDlgItem(hwnd,IDC_COLOR_BUTTON)))
+ hBrush=CreateSolidBrush(GetColorFromSelection(iPos,&obj_temp_Theme.TextColorInfo));
+ else
+ hBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
+
+ //塗りつぶす
+ hOldPen=(HPEN)SelectObject(pds->hDC,hPen);
+ hOldBrush=(HBRUSH)SelectObject(pds->hDC,hBrush);
+ Rectangle(pds->hDC,0,0,pds->rcItem.right,pds->rcItem.bottom);
+ SelectObject(pds->hDC,hOldPen);
+ SelectObject(pds->hDC,hOldBrush);
+
+ //ブラシを破棄
+ DeleteObject(hBrush);
+ }
+ else if(wParam==IDC_SAMPLE){
+ TEXTEDIT_COLOR_INFO ColorInfo;
+ ColorInfo=obj_temp_Theme.TextColorInfo;
+
+ //背景色で塗りつぶす
+ hBrush=CreateSolidBrush(ColorInfo.rgbBackground);
+ hOldBrush=(HBRUSH)SelectObject(pds->hDC,hBrush);
+ PatBlt(pds->hDC,0,0,pds->rcItem.right,pds->rcItem.bottom,PATCOPY);
+ SelectObject(pds->hDC,hOldBrush);
+ DeleteObject(hBrush);
+
+ //フォントを選択
+ extern HFONT hFont_TextEdit;
+ HFONT hOldFont;
+ hOldFont=(HFONT)SelectObject(pds->hDC,hFont_TextEdit);
+
+ ///////////////////
+ // サンプルを描画
+ ///////////////////
+
+ extern int font_width,font_height;
+ int x=0,y=0;
+
+#ifdef THETEXT
+#define SAMPLESTR_STATEMENT "div"
+#define SAMPLESTR_COMMENT ""
+#define SAMPLESTR_DEFAULT "< style= >Hello World! >"
+#define SAMPLESTR_STRING "\"color:#123456\""
+
+ y+=font_height;
+
+ //"< style= >Hello World! >"
+ SetTextColor(pds->hDC,ColorInfo.rgbDefault);
+ SetBkColor(pds->hDC,ColorInfo.rgbBackground);
+ TextOut(pds->hDC,x,y,SAMPLESTR_DEFAULT,lstrlen(SAMPLESTR_DEFAULT));
+
+ //div
+ x=font_width*1;
+ SetTextColor(pds->hDC,ColorInfo.rgbStatement);
+ TextOut(pds->hDC,x,y,SAMPLESTR_STATEMENT,lstrlen(SAMPLESTR_STATEMENT));
+ x=font_width*41;
+ TextOut(pds->hDC,x,y,SAMPLESTR_STATEMENT,lstrlen(SAMPLESTR_STATEMENT));
+
+ //"color:#123456"
+ x=font_width*11;
+ SetTextColor(pds->hDC,ColorInfo.rgbString);
+ TextOut(pds->hDC,x,y,SAMPLESTR_STRING,lstrlen(SAMPLESTR_STRING));
+
+ x=0;
+ y+=font_height*2;
+
+ //"'この行にカーソルがあります
+ hBrush=CreateSolidBrush(ColorInfo.rgbCursorBack);
+ hOldBrush=(HBRUSH)SelectObject(pds->hDC,hBrush);
+ PatBlt(pds->hDC,x,y,pds->rcItem.right,font_height,PATCOPY);
+ SelectObject(pds->hDC,hOldBrush);
+ DeleteObject(hBrush);
+
+ SetTextColor(pds->hDC,ColorInfo.rgbComment);
+ SetBkColor(pds->hDC,ColorInfo.rgbCursorBack);
+ TextOut(pds->hDC,x,y,SAMPLESTR_COMMENT,lstrlen(SAMPLESTR_COMMENT));
+#else
+#define SAMPLESTR_STATEMENT "#console"
+#define SAMPLESTR_COMMENT "'この行にカーソルがあります"
+#define SAMPLESTR_DEFAULT "Print "
+#define SAMPLESTR_STRING "\"Hello World!\""
+
+ //"#console"
+ SetTextColor(pds->hDC,ColorInfo.rgbStatement);
+ SetBkColor(pds->hDC,ColorInfo.rgbBackground);
+ TextOut(pds->hDC,0,0,SAMPLESTR_STATEMENT,lstrlen(SAMPLESTR_STATEMENT));
+ y+=font_height*2;
+
+ //"'この行にカーソルがあります
+ hBrush=CreateSolidBrush(ColorInfo.rgbCursorBack);
+ hOldBrush=(HBRUSH)SelectObject(pds->hDC,hBrush);
+ PatBlt(pds->hDC,x,y,pds->rcItem.right,font_height,PATCOPY);
+ SelectObject(pds->hDC,hOldBrush);
+ DeleteObject(hBrush);
+
+ SetTextColor(pds->hDC,ColorInfo.rgbComment);
+ SetBkColor(pds->hDC,ColorInfo.rgbCursorBack);
+ TextOut(pds->hDC,x,y,SAMPLESTR_COMMENT,lstrlen(SAMPLESTR_COMMENT));
+ y+=font_height*2;
+
+ //Print
+ SetTextColor(pds->hDC,ColorInfo.rgbDefault);
+ SetBkColor(pds->hDC,ColorInfo.rgbBackground);
+ TextOut(pds->hDC,x,y,SAMPLESTR_DEFAULT,lstrlen(SAMPLESTR_DEFAULT));
+ x+=lstrlen(SAMPLESTR_DEFAULT)*font_width;
+
+ //"Hello World!"
+ SetTextColor(pds->hDC,ColorInfo.rgbString);
+ TextOut(pds->hDC,x,y,SAMPLESTR_STRING,lstrlen(SAMPLESTR_STRING));
+#endif
+
+ SelectObject(pds->hDC,hOldFont);
+ }
+ return 0;
+
+ case WM_HELP:
+ HELPINFO *lpHelpInfo;
+ lpHelpInfo = (HELPINFO *)lParam;
+
+ HH_POPUP hp;
+ memset(&hp, 0, sizeof(HH_POPUP));
+ hp.cbStruct = sizeof(HH_POPUP);
+ hp.pt.x = lpHelpInfo->MousePos.x;
+ hp.pt.y = lpHelpInfo->MousePos.y+10;
+ hp.clrForeground = RGB(0, 0, 0);
+ hp.clrBackground = -1;
+ hp.rcMargins.left = -1;
+ hp.rcMargins.right = -1;
+ hp.rcMargins.top = -1;
+ hp.rcMargins.bottom = -1;
+ hp.idString = 0;
+ hp.pszFont="MS Sans Serif,10";
+
+ switch(lpHelpInfo->iCtrlId){
+ case IDC_TARGET:
+ hp.pszText="どの部分の色を設定するかを選択します。";
+ break;
+ default:
+ hp.pszText="";
+ break;
+ }
+ HtmlHelp(hwnd, 0, HH_DISPLAY_TEXT_POPUP, (DWORD)&hp);
+ return 1;
+ }
+ return 0;
+}
+BOOL CALLBACK Dlg_Option_Toolbar(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ switch(message){
+ case WM_INITDIALOG:
+ bOptionToolbar=1;
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDC_RESETTOOLBAR:
+ //"ツールバーの配置をすべて初期状態に戻します。\nよろしいですか?"
+ if(IDCANCEL==MessageBox(hwnd,STRING_TOOLBAR_RESET,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
+
+ //レバーコントロールを再生成
+ pobj_Rebar->ResetInitRebar();
+
+ //メニュー状態を設定
+ ResetState_DocMenu();
+ return 1;
+ }
+ break;
+
+ case WM_HELP:
+ HELPINFO *lpHelpInfo;
+ lpHelpInfo = (HELPINFO *)lParam;
+
+ HH_POPUP hp;
+ memset(&hp, 0, sizeof(HH_POPUP));
+ hp.cbStruct = sizeof(HH_POPUP);
+ hp.pt.x = lpHelpInfo->MousePos.x;
+ hp.pt.y = lpHelpInfo->MousePos.y+10;
+ hp.clrForeground = RGB(0, 0, 0);
+ hp.clrBackground = -1;
+ hp.rcMargins.left = -1;
+ hp.rcMargins.right = -1;
+ hp.rcMargins.top = -1;
+ hp.rcMargins.bottom = -1;
+ hp.idString = 0;
+ hp.pszFont="MS Sans Serif,10";
+
+ switch(lpHelpInfo->iCtrlId){
+ case IDC_RESETTOOLBAR:
+#if defined(JPN)
+ //日本語
+ hp.pszText="ツールバーの配置を初期状態に戻します。";
+#else
+ //英語
+ hp.pszText="Reset the state of the toolbar.";
+#endif
+ break;
+ default:
+ hp.pszText="";
+ break;
+ }
+ HtmlHelp(hwnd, 0, HH_DISPLAY_TEXT_POPUP, (DWORD)&hp);
+ return 1;
+ }
+ return 0;
+}
+BOOL CALLBACK Dlg_Option_Rad(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ NMHDR *nmhdr;
+ switch(message){
+ case WM_INITDIALOG:
+
+ bOptionRad=1;
+
+ //ライン アジャスタ
+ if(pobj_nv->bLineAdjust) SendDlgItemMessage(hwnd,IDC_LINEADJUST,BM_SETCHECK,BST_CHECKED,0);
+
+ break;
+ case WM_NOTIFY:
+ nmhdr=(NMHDR *)lParam;
+ if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+ if(SendDlgItemMessage(hwnd,IDC_LINEADJUST,BM_GETCHECK,0,0)) temp_bLineAdjust=1;
+ else temp_bLineAdjust=0;
+
+ if(nmhdr->code==PSN_APPLY) SaveSetting();
+ }
+ return 1;
+
+ case WM_HELP:
+ HELPINFO *lpHelpInfo;
+ lpHelpInfo = (HELPINFO *)lParam;
+
+ HH_POPUP hp;
+ memset(&hp, 0, sizeof(HH_POPUP));
+ hp.cbStruct = sizeof(HH_POPUP);
+ hp.pt.x = lpHelpInfo->MousePos.x;
+ hp.pt.y = lpHelpInfo->MousePos.y+10;
+ hp.clrForeground = RGB(0, 0, 0);
+ hp.clrBackground = -1;
+ hp.rcMargins.left = -1;
+ hp.rcMargins.right = -1;
+ hp.rcMargins.top = -1;
+ hp.rcMargins.bottom = -1;
+ hp.idString = 0;
+ hp.pszFont="MS Sans Serif,10";
+
+ switch(lpHelpInfo->iCtrlId){
+ case IDC_LINEADJUST:
+#if defined(JPN)
+ //日本語
+ hp.pszText="このチェックボックスをオンにすると、ラインアジャスタ機能が有効になります。ラインアジャスタ機能をオンにすると、マウスを使ってコントロールの移動を行う際に他のコントロール同士との位置合わせが容易に行えるようになります。";
+#else
+ //英語
+ hp.pszText="If this check is on, line adjuster becomes effective.";
+#endif
+ break;
+ default:
+ hp.pszText="";
+ break;
+ }
+ HtmlHelp(hwnd, 0, HH_DISPLAY_TEXT_POPUP, (DWORD)&hp);
+ return 1;
+ }
+ return 0;
+}
+char szDomainAdd_Name[255];
+char szDomainAdd_Domain[255];
+BOOL CALLBACK Dlg_Option_Web_Domain_Add(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ switch(message){
+ case WM_INITDIALOG:
+ SetPosCenter(hwnd);
+ SetFocus(GetDlgItem(hwnd,IDC_NAME));
+
+ if(lParam!=-1){
+ SetWindowText(hwnd,"Web検索用ドメインを編集");
+ SetDlgItemText(hwnd,IDC_NAME,szDomainAdd_Name);
+ SetDlgItemText(hwnd,IDC_DOMAIN,szDomainAdd_Domain);
+ }
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDOK:
+ GetDlgItemText(hwnd,IDC_NAME,szDomainAdd_Name,255);
+ GetDlgItemText(hwnd,IDC_DOMAIN,szDomainAdd_Domain,255);
+ EndDialog(hwnd,1);
+ return 1;
+ case IDCANCEL:
+ EndDialog(hwnd,0);
+ return 1;
+ }
+ return 0;
+ }
+ return 0;
+}
+BOOL CALLBACK Dlg_Option_Web(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ HWND hListView;
+ NMHDR *nmhdr;
+ int i;
+ char temporary[255];
+ switch(message){
+ case WM_INITDIALOG:
+
+ bOptionWeb=1;
+
+
+ //Ctrlキーによるハイパーリンク
+ if(pobj_nv->bCtrlKeyHyperLink) SendDlgItemMessage(hwnd,IDC_CTRLKEY_HYPERLINK,BM_SETCHECK,BST_CHECKED,0);
+
+ //Web検索文字列を保存するかどうか
+ if(pobj_nv->bSaveWebFindStr) SendDlgItemMessage(hwnd,IDC_SAVE_WEBFINDSTR,BM_SETCHECK,BST_CHECKED,0);
+
+
+ //拡張スタイル
+ DWORD dwStyle;
+ hListView=GetDlgItem(hwnd,IDC_DOMAIN_LIST);
+ dwStyle=ListView_GetExtendedListViewStyle(hListView);
+ dwStyle|=LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
+ ListView_SetExtendedListViewStyle(hListView,dwStyle);
+
+ LV_COLUMN ListView_Column;
+ ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+ ListView_Column.fmt=LVCFMT_LEFT;
+
+ ListView_Column.cx=80;
+ ListView_Column.pszText="表示名";
+ ListView_Column.iSubItem=0;
+ ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+ ListView_Column.cx=200;
+ ListView_Column.pszText="ドメイン";
+ ListView_Column.iSubItem++;
+ ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+ //一時オブジェクトにコピー
+ pobj_temp_DBDomain->copy_get(pobj_nv->pobj_DBDomain);
+
+ //ドメインリストにデータをセット
+ pobj_temp_DBDomain->SetListView(hListView);
+
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDC_ADD:
+ if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_OPTION_WEB_DOMAIN_ADD),hwnd,Dlg_Option_Web_Domain_Add,-1)) return 1;
+
+ pobj_temp_DBDomain->add(szDomainAdd_Name,szDomainAdd_Domain);
+ return 1;
+ case IDC_DELETE:
+ hListView=GetDlgItem(hwnd,IDC_DOMAIN_LIST);
+ for(i=0;idel(temporary);
+ break;
+ }
+ }
+ return 1;
+ case IDC_EDIT:
+ hListView=GetDlgItem(hwnd,IDC_DOMAIN_LIST);
+ for(i=0;ichange(temporary,szDomainAdd_Name,szDomainAdd_Domain);
+ }
+ }
+ return 1;
+ }
+ return 0;
+ case WM_NOTIFY:
+ nmhdr=(NMHDR *)lParam;
+ if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+
+ //Ctrlキーによるハイパーリンク
+ if(SendDlgItemMessage(hwnd,IDC_CTRLKEY_HYPERLINK,BM_GETCHECK,0,0)) temp_bCtrlKeyHyperLink=1;
+ else temp_bCtrlKeyHyperLink=0;
+
+ //Web検索文字列を保存するかどうか
+ if(SendDlgItemMessage(hwnd,IDC_SAVE_WEBFINDSTR,BM_GETCHECK,0,0)) temp_bSaveWebFindStr=1;
+ else temp_bSaveWebFindStr=0;
+
+ if(nmhdr->code==PSN_APPLY) SaveSetting();
+ }
+ if(nmhdr->idFrom==IDC_DOMAIN_LIST){
+ if(nmhdr->code==NM_DBLCLK){
+ LPNMLISTVIEW lpnmListView;
+ lpnmListView=(LPNMLISTVIEW)lParam;
+
+ char szBeforeName[255];
+ ListView_GetItemText(nmhdr->hwndFrom,lpnmListView->iItem,0,szDomainAdd_Name,255);
+ ListView_GetItemText(nmhdr->hwndFrom,lpnmListView->iItem,1,szDomainAdd_Domain,255);
+ lstrcpy(szBeforeName,szDomainAdd_Name);
+ if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_OPTION_WEB_DOMAIN_ADD),hwnd,Dlg_Option_Web_Domain_Add,lpnmListView->iItem)) return 1;
+
+ pobj_temp_DBDomain->change(szBeforeName,szDomainAdd_Name,szDomainAdd_Domain);
+ }
+ }
+ return 1;
+ }
+ return 0;
+}
+void DlgOptionSetting(HWND hwnd){
+ PROPSHEETHEADER psh;
+#define MAX_SETDLG 32
+ PROPSHEETPAGE psp[MAX_SETDLG];
+ HPROPSHEETPAGE hpsp[MAX_SETDLG];
+ int i;
+
+ bOptionWhole=0;
+ bOptionEditor=0;
+ bOptionColor=0;
+ bOptionToolbar=0;
+ bOptionRad=0;
+ bOptionWeb=0;
+
+ i=0;
+
+ //各ページのセッティング
+ psp[i].dwSize=sizeof(PROPSHEETPAGE);
+ psp[i].dwFlags=PSP_DEFAULT;
+ psp[i].hInstance=hResInst;
+ psp[i].pszTemplate=MAKEINTRESOURCE(IDD_OPTION_WHOLE);
+ psp[i].pfnDlgProc=Dlg_Option_Whole;
+ hpsp[i]=CreatePropertySheetPage(&psp[i]);
+ i++;
+ psp[i].dwSize=sizeof(PROPSHEETPAGE);
+ psp[i].dwFlags=PSP_DEFAULT;
+ psp[i].hInstance=hResInst;
+ psp[i].pszTemplate=MAKEINTRESOURCE(IDD_OPTION_EDITOR);
+ psp[i].pfnDlgProc=Dlg_Option_Editor;
+ hpsp[i]=CreatePropertySheetPage(&psp[i]);
+ i++;
+ psp[i].dwSize=sizeof(PROPSHEETPAGE);
+ psp[i].dwFlags=PSP_DEFAULT;
+ psp[i].hInstance=hResInst;
+ psp[i].pszTemplate=MAKEINTRESOURCE(IDD_OPTION_COLOR);
+ psp[i].pfnDlgProc=Dlg_Option_Color;
+ hpsp[i]=CreatePropertySheetPage(&psp[i]);
+ i++;
+ psp[i].dwSize=sizeof(PROPSHEETPAGE);
+ psp[i].dwFlags=PSP_DEFAULT;
+ psp[i].hInstance=hResInst;
+ psp[i].pszTemplate=MAKEINTRESOURCE(IDD_OPTION_TOOLBAR);
+ psp[i].pfnDlgProc=Dlg_Option_Toolbar;
+ hpsp[i]=CreatePropertySheetPage(&psp[i]);
+
+#ifndef THETEXT
+ //RADツールに関するオプションはProjectEditorのみ表示
+ i++;
+ psp[i].dwSize=sizeof(PROPSHEETPAGE);
+ psp[i].dwFlags=PSP_DEFAULT;
+ psp[i].hInstance=hResInst;
+ psp[i].pszTemplate=MAKEINTRESOURCE(IDD_OPTION_RAD);
+ psp[i].pfnDlgProc=Dlg_Option_Rad;
+ hpsp[i]=CreatePropertySheetPage(&psp[i]);
+#endif
+
+ if(bProfessional){
+ //Web検索に関するオプションはPro版のみ表示
+ i++;
+ psp[i].dwSize=sizeof(PROPSHEETPAGE);
+ psp[i].dwFlags=PSP_DEFAULT;
+ psp[i].hInstance=hResInst;
+ psp[i].pszTemplate=MAKEINTRESOURCE(IDD_OPTION_WEB);
+ psp[i].pfnDlgProc=Dlg_Option_Web;
+ hpsp[i]=CreatePropertySheetPage(&psp[i]);
+ }
+
+ i++;
+
+
+
+ ///////////////////////////
+ // 一時オブジェクトを生成
+ ///////////////////////////
+
+ pobj_temp_DBDomain=new CDBDomain();
+
+
+
+ memset(&psh,0,sizeof(PROPSHEETHEADER));
+ psh.dwSize=sizeof(PROPSHEETHEADER);
+ psh.dwFlags=PSH_PROPSHEETPAGE|PSH_NOAPPLYNOW;
+ psh.phpage=hpsp;
+ psh.hwndParent=hwnd;
+ psh.pszCaption=STRING_OPTION; //"オプション"
+ psh.nPages=i;
+ psh.nStartPage=0;
+ psh.ppsp=psp;
+ PropertySheet(&psh);
+
+
+
+ ///////////////////////////
+ // 一時オブジェクトを破棄
+ ///////////////////////////
+
+ delete pobj_temp_DBDomain;
+}
+BOOL CALLBACK DialogAbout(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ if(message==WM_INITDIALOG){
+ SetPosCenter(hwnd);
+
+ SetDlgItemText(hwnd,IDC_STATIC_NAME,VERSION_APPLI_NAME);
+
+ char temporary[1024];
+ sprintf(temporary,"Version %s",VERSION_STRING);
+ SetDlgItemText(hwnd,IDC_STATIC_VERSION,temporary);
+
+#ifdef THETEXT
+ if(bProfessional){
+ lstrcpy(temporary," このアプリケーションはすべての機能を利用可能なPro版です。");
+ ShowWindow(GetDlgItem(hwnd,IDC_GOPRO),SW_HIDE);
+ }
+ else{
+#ifdef SHAREWARE
+ lstrcpy(temporary," 機能制限がかかったスタンダードモードで動作しています。Pro版のご購入手続きを行っていただくことで、提供される機能のすべてをご利用いただけます。");
+#else
+ lstrcpy(temporary," このアプリケーションは基本機能を備えたStandard版です。より高機能なPro版をご検討の方は、下のボタンをクリックしてください。");
+#endif
+ ShowWindow(GetDlgItem(hwnd,IDC_GOPRO),SW_SHOW);
+ }
+#else //THETEXT
+ if(bProfessional){
+ lstrcpy(temporary," このアプリケーションはすべての機能を利用可能なPro版です。");
+ ShowWindow(GetDlgItem(hwnd,IDC_GOPRO),SW_HIDE);
+ ShowWindow(GetDlgItem(hwnd,IDC_INPUT_PASSWORD),SW_HIDE);
+ }
+ else{
+ lstrcpy(temporary," このアプリケーションは基本機能を備えたStandard版です。TheText Proをご購入いただくことによって、ProjectEditor Proへの拡張機能を行うことができます。");
+ ShowWindow(GetDlgItem(hwnd,IDC_GOPRO),SW_SHOW);
+ ShowWindow(GetDlgItem(hwnd,IDC_INPUT_PASSWORD),SW_SHOW);
+ }
+#endif
+ SetDlgItemText(hwnd,IDC_NOTE,temporary);
+
+
+#ifndef THETEXT
+ //ライブラリ開発チーム
+ LoadString(hResInst,IDS_DEV_GROUP,temporary,1024);
+ SetDlgItemText(hwnd,IDC_DEV_GROUP,temporary);
+#endif
+ }
+ if(message==WM_COMMAND){
+ switch(LOWORD(wParam)){
+ case IDCANCEL:
+ EndDialog(hwnd,NULL);
+ return 1;
+ case IDC_GOPRO:
+ ShellExecute(hwnd,"open","http://www.discoversoft.net/thetext_pro.html",NULL,NULL,SW_SHOWNORMAL);
+ return 1;
+#ifndef THETEXT
+ //ProjectEditorのみ
+ case IDC_INPUT_PASSWORD:
+ if(DialogBox(hResInst,MAKEINTRESOURCE(IDD_PASSWORD),hwnd,DlgPassword)){
+ WriteSerialHash();
+
+ MessageBox(hwnd,"シリアルIDを正常に認証致しました。\n次回起動時から、機能拡張が施されたProモードでProjectEditorをご利用いただくことができます。",APPLICATION_NAME,MB_OK);
+ EnableWindow(GetDlgItem(hwnd,IDC_INPUT_PASSWORD),0);
+ }
+ return 1;
+#endif
+ }
+ }
+ return 0;
+}
+BOOL CALLBACK DlgPassword(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ switch(message){
+ case WM_INITDIALOG:
+ SetPosCenter(GetDesktopWindow(),hwnd);
+ SetFocus(GetDlgItem(hwnd,IDC_PASSWORD));
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDOK:
+ char temporary[255];
+ GetDlgItemText(hwnd,IDC_PASSWORD,temporary,255);
+
+ if(!SerialCheck(temporary)){
+ MessageBox(hwnd,"入力されたシリアルIDが正しくありません。",APPLICATION_NAME,MB_OK);
+ return 1;
+ }
+ EndDialog(hwnd,1);
+ return 1;
+ case IDCANCEL:
+ EndDialog(hwnd,0);
+ return 1;
+ }
+ return 0;
+ }
+ return 0;
+}
+BOOL CALLBACK DlgProfessionalStart(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ switch(message){
+ case WM_INITDIALOG:
+ SetPosCenter(GetDesktopWindow(),hwnd);
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDCANCEL:
+ EndDialog(hwnd,0);
+ return 1;
+ }
+ return 0;
+ }
+ return 0;
+}
Index: /ProjectEditor/DocumentAdvice.cpp
===================================================================
--- /ProjectEditor/DocumentAdvice.cpp (revision 3)
+++ /ProjectEditor/DocumentAdvice.cpp (revision 3)
@@ -0,0 +1,274 @@
+#include "Common.h"
+
+void MenuAdvice(WPARAM msg){
+ /////////////////////////////////////////////////////
+ // コマンド解説(ステータスバーに表示されるテキスト)
+ /////////////////////////////////////////////////////
+ extern char CmdMsg[255];
+
+#if defined(JPN)
+ //日本語
+ if(LOWORD(msg)==IDM_NEW) SetStatusText("新規にプロジェクトまたはドキュメントを作成します");
+ else if(LOWORD(msg)==IDM_OPEN) SetStatusText("既存のドキュメントを開きます");
+ else if(LOWORD(msg)==IDM_CLOSE) SetStatusText("作業中のファイルを閉じます");
+ else if(LOWORD(msg)==IDM_SAVE) SetStatusText("作業中のファイルを保存します");
+ else if(LOWORD(msg)==IDM_NEWSAVE) SetStatusText("作業中のファイルを新しい名前を付けて保存します");
+ else if(LOWORD(msg)==IDM_ALLSAVE) SetStatusText("開いているファイルをすべて保存します");
+ else if(LOWORD(msg)==IDM_PROJECT_OPEN) SetStatusText("既存のプロジェクトを開きます");
+ else if(LOWORD(msg)==IDM_PROJECT_SAVE) SetStatusText("作業中のプロジェクトを保存します");
+ else if(LOWORD(msg)==IDM_PROJECT_CLOSE) SetStatusText("作業中のプロジェクトを閉じます");
+ else if(LOWORD(msg)==IDM_EXIT) SetStatusText("アプリケーションの終了と内容の保存確認をします");
+ else if(LOWORD(msg)==IDM_UNDO) SetStatusText("直前の操作を元にもどします");
+ else if(LOWORD(msg)==IDM_REDO) SetStatusText("前の未完了操作を繰り返します");
+ else if(LOWORD(msg)==IDM_CUT) SetStatusText("選択範囲を切り取り、クリップボードへコピーします");
+ else if(LOWORD(msg)==IDM_COPY) SetStatusText("選択範囲をクリップボードへコピーします");
+ else if(LOWORD(msg)==IDM_PASTE) SetStatusText("挿入位置にクリップボードの内容を挿入します");
+ else if(LOWORD(msg)==IDM_DELETE) SetStatusText("選択範囲を削除します");
+ else if(LOWORD(msg)==IDM_ALLSELECT) SetStatusText("ファイル全体を選択します");
+ else if(LOWORD(msg)==IDM_FIND) SetStatusText("作業中のドキュメント内を検索します");
+ else if(LOWORD(msg)==IDM_PERMUTATION) SetStatusText("指定した文字列を他の文字列で置換します");
+
+#ifdef THETEXT
+ else if(LOWORD(msg)==IDM_STRING_COUNT) SetStatusText("作業中ドキュメントの文字数をカウントします");
+#endif
+
+ else if(LOWORD(msg)==IDM_PROJECTVIEW) SetStatusText("プロジェクトビューの表示/非表示を切り替えます");
+ else if(LOWORD(msg)==IDM_PROJECT_OPTION) SetStatusText("プロジェクトオプションの設定を行います");
+ else if(LOWORD(msg)==IDM_TOPMOST) SetStatusText("エディタの最前面表示ON/OFFを切り替えます");
+ else if(LOWORD(msg)==IDM_SET) SetStatusText("エディタオプションの設定を行います");
+ else if(LOWORD(msg)==IDM_DEBUG) SetStatusText("プログラムをデバッグ用にコンパイルし、デバッグ実行します");
+ else if(LOWORD(msg)==IDM_DEBUGCOMPILE) SetStatusText("プログラムをデバッグ用にコンパイルします");
+ else if(LOWORD(msg)==IDM_RELEASECOMPILE) SetStatusText("プログラムをリリース用にコンパイルします");
+ else if(LOWORD(msg)==IDM_TOPIC) SetStatusText("ヘルプファイルを開きます");
+ else if(LOWORD(msg)==IDM_ABOUT) SetStatusText("ActiveBasicのバージョン情報を表示します");
+ else SetStatusText(CmdMsg);
+#else
+ //英語
+ if(LOWORD(msg)==IDM_NEW) SetStatusText("Create a new document");
+ else if(LOWORD(msg)==IDM_OPEN) SetStatusText("Open an existing document");
+ else if(LOWORD(msg)==IDM_CLOSE) SetStatusText("Close the active document");
+ else if(LOWORD(msg)==IDM_SAVE) SetStatusText("Save the active document");
+ else if(LOWORD(msg)==IDM_NEWSAVE) SetStatusText("Save the active document with a new name");
+ else if(LOWORD(msg)==IDM_ALLSAVE) SetStatusText("Save all the modified documents");
+ else if(LOWORD(msg)==IDM_PROJECT_OPEN) SetStatusText("Open an existing project");
+ else if(LOWORD(msg)==IDM_PROJECT_SAVE) SetStatusText("Save the active project");
+ else if(LOWORD(msg)==IDM_PROJECT_CLOSE) SetStatusText("Close the active project");
+ else if(LOWORD(msg)==IDM_EXIT) SetStatusText("Quit the application, prompts you to save modified documents");
+ else if(LOWORD(msg)==IDM_UNDO) SetStatusText("Undo the last action");
+ else if(LOWORD(msg)==IDM_REDO) SetStatusText("Redo the previously undone action");
+ else if(LOWORD(msg)==IDM_CUT) SetStatusText("Cut the selection and puts it on the Clipboard");
+ else if(LOWORD(msg)==IDM_COPY) SetStatusText("Copy the selection and puts it on the Clipboard");
+ else if(LOWORD(msg)==IDM_PASTE) SetStatusText("Insert Clipboard contents");
+ else if(LOWORD(msg)==IDM_DELETE) SetStatusText("Erase the selection");
+ else if(LOWORD(msg)==IDM_ALLSELECT) SetStatusText("Select the entire document");
+ else if(LOWORD(msg)==IDM_FIND) SetStatusText("Search for text in the active document");
+ else if(LOWORD(msg)==IDM_PERMUTATION) SetStatusText("Replace occurrences of search string");
+ else if(LOWORD(msg)==IDM_PROJECTVIEW) SetStatusText("Show or hide ProjectView");
+ else if(LOWORD(msg)==IDM_PROJECT_OPTION) SetStatusText("Set project options");
+ else if(LOWORD(msg)==IDM_TOPMOST) SetStatusText("Mark ProjectEditor stay on top of the other applications");
+ else if(LOWORD(msg)==IDM_SET) SetStatusText("Set editor options");
+ else if(LOWORD(msg)==IDM_DEBUG) SetStatusText("Debug the program");
+ else if(LOWORD(msg)==IDM_DEBUGCOMPILE) SetStatusText("Compile the program for debugging");
+ else if(LOWORD(msg)==IDM_RELEASECOMPILE) SetStatusText("Compile the program for release");
+ else if(LOWORD(msg)==IDM_TOPIC) SetStatusText("Open the Help topics");
+ else if(LOWORD(msg)==IDM_ABOUT) SetStatusText("Display information about ActiveBasic");
+ else SetStatusText(CmdMsg);
+#endif
+}
+
+void ShowToolTipText(LPTOOLTIPTEXT TipText){
+ ////////////////////////////////////////////////////////////////////////////
+ // ツールチップ(ツールバーにポイントしたときにポップアップされるテキスト)
+ ////////////////////////////////////////////////////////////////////////////
+
+#if defined(JPN)
+ //日本語
+ if(TipText->hdr.idFrom==IDM_NEW) TipText->lpszText="新規作成 (Ctrl+N)";
+ else if(TipText->hdr.idFrom==IDM_OPEN) TipText->lpszText="開く (Ctrl+O)";
+ else if(TipText->hdr.idFrom==IDM_SAVE) TipText->lpszText="保存 (Ctrl+S)";
+ else if(TipText->hdr.idFrom==IDM_ALLSAVE) TipText->lpszText="すべて保存";
+ else if(TipText->hdr.idFrom==IDM_CUT) TipText->lpszText="切り取り (Ctrl+X)";
+ else if(TipText->hdr.idFrom==IDM_COPY) TipText->lpszText="コピー (Ctrl+C)";
+ else if(TipText->hdr.idFrom==IDM_PASTE) TipText->lpszText="貼り付け (Ctrl+V)";
+ else if(TipText->hdr.idFrom==IDM_UNDO) TipText->lpszText="元に戻す (Ctrl+Z)";
+ else if(TipText->hdr.idFrom==IDM_REDO) TipText->lpszText="やり直し (Ctrl+Y)";
+ else if(TipText->hdr.idFrom==IDM_FIND) TipText->lpszText="検索 (Ctrl+F)";
+ else if(TipText->hdr.idFrom==IDM_DEBUG) TipText->lpszText="デバッグ実行 (F2)";
+ else if(TipText->hdr.idFrom==IDM_DEBUGCOMPILE) TipText->lpszText="デバッグ コンパイル (F4)";
+ else if(TipText->hdr.idFrom==IDM_RELEASECOMPILE) TipText->lpszText="リリース コンパイル (F7)";
+#else
+ //英語
+ if(TipText->hdr.idFrom==IDM_NEW) TipText->lpszText="New Document (Ctrl+N)";
+ else if(TipText->hdr.idFrom==IDM_OPEN) TipText->lpszText="Open Document (Ctrl+O)";
+ else if(TipText->hdr.idFrom==IDM_SAVE) TipText->lpszText="Save Document (Ctrl+S)";
+ else if(TipText->hdr.idFrom==IDM_ALLSAVE) TipText->lpszText="Save All Document";
+ else if(TipText->hdr.idFrom==IDM_CUT) TipText->lpszText="Cut (Ctrl+X)";
+ else if(TipText->hdr.idFrom==IDM_COPY) TipText->lpszText="Copy (Ctrl+C)";
+ else if(TipText->hdr.idFrom==IDM_PASTE) TipText->lpszText="Paste (Ctrl+V)";
+ else if(TipText->hdr.idFrom==IDM_UNDO) TipText->lpszText="Undo (Ctrl+Z)";
+ else if(TipText->hdr.idFrom==IDM_REDO) TipText->lpszText="Redo (Ctrl+Y)";
+ else if(TipText->hdr.idFrom==IDM_FIND) TipText->lpszText="Find (Ctrl+F)";
+ else if(TipText->hdr.idFrom==IDM_DEBUG) TipText->lpszText="Run for Debugging (F2)";
+ else if(TipText->hdr.idFrom==IDM_DEBUGCOMPILE) TipText->lpszText="Compile for Debugging (F4)";
+ else if(TipText->hdr.idFrom==IDM_RELEASECOMPILE) TipText->lpszText="Compile for Release (F7)";
+#endif
+ MenuAdvice(TipText->hdr.idFrom);
+}
+
+char *reflexive_Include(char *buffer,char ***pppFilePath,int *pFileNum,char *pDefaultDir){
+ extern HANDLE hHeap;
+ int i,i2,i3,i4,sw1,sw2,FileSize;
+ char temporary[MAX_PATH],temp2[MAX_PATH+255],*temp3;
+ DWORD AccBytes;
+
+ //重複チェック用
+ char **ppFilePath;
+ int FileNum;
+ ppFilePath=*pppFilePath;
+ FileNum=*pFileNum;
+
+ for(i=0;;i++){
+ if(memcmp(buffer+i,"#include",8)==0&&(!IsVariableChar(buffer[i+8]))){
+ i2=i+8;
+ while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+ sw1=0;
+ if(buffer[i2]=='\"') i2++;
+ else if(buffer[i2]=='<'){
+ i2++;
+ sw1=1;
+ }
+ for(i3=0;;i2++,i3++){
+ if((buffer[i2]=='\"'&&sw1==0)||(buffer[i2]=='>'&&sw1==1)||(buffer[i2]=='\r'&&buffer[i2+1]=='\n')||buffer[i2]=='\0'){
+ temporary[i3]=0;
+ break;
+ }
+ temporary[i3]=buffer[i2];
+ }
+ while((!(buffer[i2]=='\r'&&buffer[i2+1]=='\n'))&&buffer[i2]!='\0') i2++;
+
+ if(sw1){
+ sprintf(temp2,"%sInclude\\%s",pj_editor_Dir,temporary);
+ lstrcpy(temporary,temp2);
+ }
+ else{
+ GetFullPath(temporary,pDefaultDir);
+ }
+
+
+ //////////////////
+ // 重複チェック
+ //////////////////
+ for(i3=0,sw2=0;i3buffer);
+
+ temp3=(char *)HeapAlloc(hHeap,0,FileSize+MEM_SPACE);
+ memcpy(temp3,MdiInfo[i3].pmti->buffer,FileSize);
+ temp3[FileSize]=0;
+ }
+
+ //新しい参照ディレクトリを取得
+ char DefaultDir[MAX_PATH+1024];
+ _splitpath(temporary,DefaultDir,temp2,0,0);
+ lstrcat(DefaultDir,temp2);
+
+ //インクルードの再帰呼び出し
+ temp3=reflexive_Include(temp3,&ppFilePath,&FileNum,DefaultDir);
+ FileSize=lstrlen(temp3);
+
+ i4=lstrlen(buffer)+FileSize-(i2-i);
+ if(FileSize>(i2-i)) buffer=(char *)HeapReAlloc(hHeap,0,buffer,i4+1+MEM_SPACE);
+ SlideString(buffer+i2,FileSize-(i2-i));
+
+ memcpy(buffer+i,temp3,FileSize);
+
+ HeapDefaultFree(temp3);
+
+ i--;
+ continue;
+ }
+
+ for(;;i++){
+ if(buffer[i]=='\0') break;
+ if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
+ i++;
+ break;
+ }
+ }
+ if(buffer[i]=='\0') break;
+ }
+
+finish:
+
+ //重複チェック用
+ *pppFilePath=ppFilePath;
+ *pFileNum=FileNum;
+
+ return buffer;
+}
+
+char *IncludeFiles(char *buffer){
+ extern HANDLE hHeap;
+ int i;
+
+ //参照ディレクトリ
+ char *pDefaultDir;
+ extern PROJECTINFO ProjectInfo;
+ if(ProjectInfo.name[0])
+ pDefaultDir=ProjectInfo.dir;
+ else pDefaultDir=pj_editor_Dir;
+
+ //重複チェック用
+ char **ppFilePath;
+ int FileNum;
+ ppFilePath=(char **)HeapAlloc(hHeap,0,1);
+ FileNum=0;
+
+ buffer=reflexive_Include(buffer,&ppFilePath,&FileNum,pDefaultDir);
+
+ for(i=0;ihBackBmp){
+ HDC memdc2;
+ memdc2=CreateCompatibleDC(memdc);
+ SelectObject(memdc2,pobj_DBTheme->hBackBmp);
+ BitBlt(memdc,
+ cx-(pobj_DBTheme->sizeBackBmp.cx),
+ cy-(pobj_DBTheme->sizeBackBmp.cy),
+ pobj_DBTheme->sizeBackBmp.cx,pobj_DBTheme->sizeBackBmp.cy,
+ memdc2,0,0,SRCCOPY);
+ DeleteDC(memdc2);
+ }
+#endif
+
+ //フォントを設定
+ extern HFONT hFont_TextEdit;
+ hOldFont=(HFONT)SelectObject(memdc,hFont_TextEdit);
+
+ lpszBuffer=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+ length=0;
+ }
+ ~CDrawReserve(){
+ SelectObject(memdc,hOldBitmap);
+ DeleteObject(hMemBmp);
+
+ SelectObject(memdc,hOldFont);
+
+ DeleteDC(memdc);
+
+ HeapDefaultFree(lpszBuffer);
+ }
+
+ void draw(){
+ if(length==0) return;
+ SetTextColor(memdc,NowColor);
+ if(NowBackColor==tci.rgbBackground){
+ SetBkMode(memdc,TRANSPARENT);
+ }
+ else{
+ SetBkMode(memdc,OPAQUE);
+ SetBkColor(memdc,NowBackColor);
+ }
+
+ HFONT hBeforeFont;
+ if(bNowUnder){
+ //下線付きフォントに設定
+ extern HFONT hFont_HyperLink_TextEdit;
+ hBeforeFont=(HFONT)SelectObject(memdc,hFont_HyperLink_TextEdit);
+ }
+
+ int offset=0;
+ if(x<0){
+ offset=-x;
+
+ //左端の全角文字の文字化けを避けるために10バイトの余裕を作る
+ offset-=10;
+ if(offset<0) offset=0;
+
+ length-=offset;
+ if(length<0) return;
+ }
+
+ if(length>iMax_OneLine_TextLength+10){
+ length=iMax_OneLine_TextLength+10;
+ }
+
+ int i;
+ int *lpDxWidths;
+ lpDxWidths=(int *)malloc((length+1)*sizeof(int));
+ for(i=0;ibEditor_LineNumber){
+ hBrush=CreateSolidBrush(RGB(220,220,220));
+ hOldBrush=(HBRUSH)SelectObject(memdc,hBrush);
+
+
+ /////////////////////////////////////////////////////
+ // エディタ画面左端のコントロールタブの行番号を描画
+ /////////////////////////////////////////////////////
+
+ //灰色で塗りつぶす
+ PatBlt(memdc,
+ 0,
+ 0,
+ iControlTabSpace,
+ ClientSize.cy,
+ PATCOPY);
+
+ extern HFONT hFont_LineNumber;
+ int LineNumberFontHeight;
+
+ HFONT hOldFont;
+ hOldFont=(HFONT)SelectObject(memdc,hFont_LineNumber);
+ SetTextColor(memdc,RGB(60,60,60));
+ SetBkColor(memdc,RGB(220,220,220));
+
+ SIZE size;
+ GetTextExtentPoint32(memdc,"A",1,&size);
+ LineNumberFontHeight=size.cy;
+
+
+ //ブレークポイントの描画を準備
+ CFileBreakPoint *pobj_FileBreakPoint=0;
+ if(ProjectInfo.name[0]){
+ pobj_FileBreakPoint=
+ ProjectInfo.pobj_DBBreakPoint->EnumLines(MdiInfo[m_WndNum].path);
+ }
+ else{
+ extern CDBBreakPoint *pobj_DBBreakPoint;
+ pobj_FileBreakPoint=pobj_DBBreakPoint->EnumLines(MdiInfo[m_WndNum].path);
+ }
+
+
+ int i,i2;
+ char temporary[255],temp2[255];
+ if(ycheck(i-BaseY)){
+ bBreakPoint=1;
+ }
+ }
+
+ if(bBreakPoint){
+ DrawIconEx(memdc,3,i*font_height+(font_height-16)/2,
+ (HICON)LoadImage(hIconResInst,MAKEINTRESOURCE(IDI_BREAKPOINT_FLAG),IMAGE_ICON,16,16,LR_SHARED),
+ 16,16,0,NULL,DI_NORMAL);
+ }
+ else{
+ sprintf(temp2,"%%%dd:",iLineNumberTextCount);
+ sprintf(temporary,temp2,(i-BaseY)+1);
+
+ TextOut(memdc,
+ 3,
+ i*font_height+(font_height-LineNumberFontHeight)/2,
+ temporary,
+ lstrlen(temporary));
+ }
+ }
+
+ SelectObject(memdc,hOldFont);
+
+
+ //ブラシを破棄
+ SelectObject(memdc,hOldBrush);
+ DeleteObject(hBrush);
+ }
+ else{
+ ////////////////////////////////////////////
+ // エディタ画面左端のコントロールタブを描画
+ // ※行番号は非表示
+ ////////////////////////////////////////////
+
+ hBrush=CreateSolidBrush(RGB(220,220,220));
+ hOldBrush=(HBRUSH)SelectObject(memdc,hBrush);
+
+ PatBlt(memdc,
+ 0,
+ 0,
+ iControlTabSpace,
+ ClientSize.cy,
+ PATCOPY);
+
+ SelectObject(memdc,hOldBrush);
+ DeleteObject(hBrush);
+ }
+
+
+ //メモリDCの内容を画面に描画
+ BitBlt(hdc,0,0,ClientSize.cx,ClientSize.cy,memdc,0,0,SRCCOPY);
+ }
+};
+
+void TextEdit_DrawBuffer(HDC hdc,int WndNum){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ int i,i2;
+ int x,y;
+ int BaseX,BaseY,CharX;
+ char *pBuf,temporary[255];
+ HWND hEdit;
+
+
+ //背景モード、カラーの設定
+ COLORREF DefaultBackColor,CaretBackColor;
+ DefaultBackColor=tci.rgbBackground;
+
+ RECT ClientRect;
+ hEdit=GetWindow(MdiInfo[WndNum].hwnd,GW_CHILD);
+ GetClientRect(hEdit,&ClientRect);
+
+ //エディタ画面左端のコントロールタブ
+ int iControlTabSpace;
+ int iLineNumberTextCount;
+ iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace;
+ iLineNumberTextCount=MdiInfo[WndNum].pmti->iLineNumberTextCount;
+
+ //一ページ中に表示できる行数を取得
+ int OnePage_CharHeight;
+ OnePage_CharHeight=(ClientRect.bottom/font_height)+1;
+
+ //描画用クラス
+ CDrawReserve obj_dr(
+ WndNum,
+ hdc,
+ ClientRect.right-ClientRect.left,ClientRect.bottom-ClientRect.top,
+ iControlTabSpace,
+ OnePage_CharHeight,
+ iLineNumberTextCount);
+
+
+ //テキストバッファをコード内で参照しやすいようにポインタ変数を利用する
+ pBuf=MdiInfo[WndNum].pmti->buffer;
+
+ //選択範囲を取得
+ CHARRANGE CharRange;
+ TextEdit_GetSel(WndNum,&CharRange);
+
+ //ベース描画ポジションを取得(文字単位)
+ BaseX=0;
+ BaseY=0;
+ GetScrollBaseCaretPos(WndNum,&BaseX,&BaseY);
+
+ if(pobj_nv->bEditor_CaretLine_BackGround){
+ //カーソル行の色を変える
+ CaretBackColor=tci.rgbCursorBack;
+ }
+ else{
+ //カーソル行の色を変えない
+ CaretBackColor=tci.rgbBackground;
+ }
+ HBRUSH hCaretBackBrush;
+ hCaretBackBrush=CreateSolidBrush(CaretBackColor);
+
+ BOOL IsStr=0;
+ DWORD dwComment=0;
+ BOOL bMultiLineComment;
+ COLORREF NextColor,NextBackColor;
+ int MaxX=0;
+ x=BaseX;
+ y=BaseY;
+ CharX=0; //左端から何文字目かを示す
+ int bHyperLinkUnderBar=0; //ハイパーリンク用下線の表示スイッチ
+ for(i=0;;i++){
+ if(pBuf[i]=='\0'){
+ if(0<=y&&y<=OnePage_CharHeight){
+ if(MdiInfo[WndNum].pmti->StartCaretPos.y==y-BaseY){
+ ////////////////////////////////////
+ // カーソル行では余白を塗りつぶす
+ ////////////////////////////////////
+
+ HBRUSH hTempBrush;
+ hTempBrush=(HBRUSH)SelectObject(obj_dr.memdc,hCaretBackBrush);
+
+ //終端コードよりも右側はブラシで塗りつぶす
+ PatBlt(obj_dr.memdc,
+ x*font_width +iControlTabSpace,
+ y*font_height,
+ ClientRect.right-(x*font_width +iControlTabSpace),
+ font_height,
+ PATCOPY);
+
+ //カーソル行
+ SelectObject(obj_dr.memdc,hTempBrush);
+ }
+
+ //行番号が末端行にも表示されるようにするために描画予約を行う
+ obj_dr.DrawReserve(
+ x,
+ y,
+ NULL,
+ NULL,
+ bHyperLinkUnderBar,
+ "",0);
+ }
+
+ if(MaxXStartCaretPos.y==y-BaseY){
+ ///////////////////////////////////////////////////////////
+ //改行コードよりも右側は白いブラシで塗りつぶす(カーソル行用)
+ ///////////////////////////////////////////////////////////
+
+ HBRUSH hTempBrush;
+
+ //カーソル行
+ hTempBrush=(HBRUSH)SelectObject(obj_dr.memdc,hCaretBackBrush);
+
+ PatBlt(obj_dr.memdc,
+ x*font_width +iControlTabSpace,
+ y*font_height,
+ ClientRect.right-(x*font_width +iControlTabSpace),
+ font_height,
+ PATCOPY);
+
+ //カーソル行
+ SelectObject(obj_dr.memdc,hTempBrush);
+ }
+
+ y++;
+
+ x=BaseX;
+ CharX=0;
+ i--;
+ continue;
+ }
+
+ if(MdiInfo[WndNum].DocType==WNDTYPE_BASIC){
+
+ if(pBuf[i]=='\"'&&dwComment==0) IsStr^=1;
+
+ //複数行に渡るコメントを考慮
+ if(pBuf[i]=='/'&&pBuf[i+1]=='*'&&IsStr==0&&dwComment==0){
+ dwComment=12;
+ bMultiLineComment=1;
+ }
+ if(pBuf[i]=='*'&&pBuf[i+1]=='/'&&
+ dwComment==10&&bMultiLineComment){
+ dwComment=3;
+ }
+
+ //単行コメント
+ if(pBuf[i]=='\''&&dwComment==0&&IsStr==0){
+ dwComment=10;
+ bMultiLineComment=0;
+ }
+
+ if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+ //単行コメント中での改行は、コメントを解除
+ if(dwComment&&bMultiLineComment==0){
+ IsStr=0;
+ dwComment=0;
+ }
+ }
+ if(dwComment!=0&&dwComment!=10) dwComment--;
+ }
+ if(MdiInfo[WndNum].DocType==WNDTYPE_HTML){
+ //複数行に渡るコメントを考慮
+ if(pBuf[i]=='<'&&pBuf[i+1]=='!'&&pBuf[i+2]=='-'&&pBuf[i+3]=='-'&&IsStr==0&&dwComment==0){
+ dwComment=10;
+ }
+ if(pBuf[i]=='-'&&pBuf[i+1]=='-'&&pBuf[i+2]=='>'&&
+ dwComment){
+ dwComment=4;
+ }
+ if(dwComment!=0&&dwComment!=10) dwComment--;
+ }
+
+ //ハイパーリンク用下線
+ if(MdiInfo[WndNum].pmti->iUnderStart<=i&&iiUnderEnd)
+ bHyperLinkUnderBar=1;
+ else bHyperLinkUnderBar=0;
+
+ if(0<=y&&y<=OnePage_CharHeight){
+ //////////////////////////////////
+ // 表示中ページでは文字単位で描画
+ //////////////////////////////////
+ //※i2に描画する文字数を格納する
+
+ NextBackColor=DefaultBackColor;
+ if(dwComment){
+ //複数行に渡るコメント
+ NextColor=tci.rgbComment;
+ }
+ else{
+ //通常カラー
+ NextColor=MdiInfo[WndNum].pmti->pColorRef[i];
+ }
+
+ if(CharRange.cpMin<=i&&iStartCaretPos.y==y-BaseY){
+ //カーソル行
+ NextBackColor=CaretBackColor;
+ }
+ }
+
+ if(IsDBCSLeadByte(pBuf[i])){
+ //マルチバイト文字
+ i2=2;
+ obj_dr.DrawReserve(
+ x,
+ y,
+ NextColor,
+ NextBackColor,
+ bHyperLinkUnderBar,
+ pBuf+i,i2);
+
+ i++;
+ }
+ else if(pBuf[i]=='\t'){
+ //タブ文字
+ int tab;
+ tab=pobj_nv->TabSize;
+
+ if((x-BaseX)%tab==0) i2=tab;
+ else i2=tab-(x-BaseX)%tab;
+ memset(temporary,' ',i2);
+ temporary[i2]=0;
+
+ obj_dr.DrawReserve(
+ x,
+ y,
+ NextColor,
+ NextBackColor,
+ bHyperLinkUnderBar,
+ temporary,i2);
+ }
+ else if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+ //改行文字は1スペースだけ空白を描画しておく(反転表示をするため)
+ i2=1;
+ temporary[0]=' ';
+ temporary[1]=0;
+ obj_dr.DrawReserve(
+ x,
+ y,
+ NextColor,
+ NextBackColor,
+ bHyperLinkUnderBar,
+ temporary,i2);
+
+
+ if(MdiInfo[WndNum].pmti->StartCaretPos.y==y-BaseY){
+ ///////////////////////////////////////////////////////////
+ //改行コードよりも右側は白いブラシで塗りつぶす(カーソル行用)
+ ///////////////////////////////////////////////////////////
+
+ HBRUSH hTempBrush;
+
+ //カーソル行
+ hTempBrush=(HBRUSH)SelectObject(obj_dr.memdc,hCaretBackBrush);
+
+ PatBlt(obj_dr.memdc,
+ (x+i2)*font_width +iControlTabSpace,
+ y*font_height,
+ ClientRect.right-((x+i2)*font_width +iControlTabSpace),
+ font_height,
+ PATCOPY);
+
+ //カーソル行
+ SelectObject(obj_dr.memdc,hTempBrush);
+ }
+ }
+ else{
+ //通常のキャラ文字
+ i2=1;
+ obj_dr.DrawReserve(
+ x,
+ y,
+ NextColor,
+ NextBackColor,
+ bHyperLinkUnderBar,
+ pBuf+i,i2);
+ }
+ }
+ else{
+ ////////////////////////////////////////
+ // 非表示ページでは文字数の計算だけ行う
+ ////////////////////////////////////////
+ //※i2に描画する文字数を格納する
+
+ if(IsDBCSLeadByte(pBuf[i])){
+ //マルチバイト文字
+ i2=2;
+ i++;
+ }
+ else if(pBuf[i]=='\t'){
+ //タブ文字
+ int tab;
+ tab=pobj_nv->TabSize;
+
+ if((x-BaseX)%tab==0) i2=tab;
+ else i2=tab-(x-BaseX)%tab;
+ }
+ else{
+ //通常のキャラ文字(改行文字を含む)
+ i2=1;
+ }
+ }
+
+ if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+ y++;
+
+ if(MaxXbRightTurn){
+ MaxX=0;
+ }
+
+ ResetScrollbar(WndNum,MaxX,(-BaseY)+y);
+}
Index: /ProjectEditor/DrawWindow.cpp
===================================================================
--- /ProjectEditor/DrawWindow.cpp (revision 3)
+++ /ProjectEditor/DrawWindow.cpp (revision 3)
@@ -0,0 +1,1767 @@
+#include "Common.h"
+
+void DrawLineInClient(int WndNum,long StartX,long StartY,long EndX,long EndY){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ MoveToEx(MdiInfo[WndNum].MdiRadInfo->hMemDC,
+ StartX+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
+ StartY+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
+ NULL);
+ LineTo(MdiInfo[WndNum].MdiRadInfo->hMemDC,
+ EndX+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
+ EndY+MdiInfo[WndNum].MdiRadInfo->ClientPos.y);
+}
+void DrawRectangleInClient(int WndNum,long left,long top,long right,long bottom,COLORREF RGB_Pen,COLORREF RGB_Brush,BOOL bBrushing){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ HPEN hPen,hOldPen;
+ HBRUSH hBrush,hOldBrush;
+
+ hPen=CreatePen(PS_SOLID,0,RGB_Pen);
+ if(bBrushing) hBrush=CreateSolidBrush(RGB_Brush);
+ else hBrush=(HBRUSH)GetStockObject(NULL_BRUSH);
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hBrush);
+
+ Rectangle(MdiInfo[WndNum].MdiRadInfo->hMemDC,
+ left+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
+ top+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
+ right+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
+ bottom+MdiInfo[WndNum].MdiRadInfo->ClientPos.y);
+
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldBrush);
+ DeleteObject(hPen);
+ if(bBrushing) DeleteObject(hBrush);
+}
+void DrawButtonEdge(int WndNum,POINT *pPos,SIZE *pSize){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ HPEN hPen,hOldPen;
+
+ //光源方向の縁
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ DrawLineInClient(WndNum,
+ pPos->x, pPos->y,
+ pPos->x+pSize->cx-1, pPos->y);
+ DrawLineInClient(WndNum,
+ pPos->x, pPos->y,
+ pPos->x, pPos->y+pSize->cy-1);
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+
+ //影側の縁
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DDKSHADOW));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ DrawLineInClient(WndNum,
+ pPos->x, pPos->y+pSize->cy-1,
+ pPos->x+pSize->cx, pPos->y+pSize->cy-1);
+ DrawLineInClient(WndNum,
+ pPos->x+pSize->cx-1, pPos->y,
+ pPos->x+pSize->cx-1, pPos->y+pSize->cy-1);
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ DrawLineInClient(WndNum,
+ pPos->x+1, pPos->y+pSize->cy-2,
+ pPos->x+pSize->cx-1, pPos->y+pSize->cy-2);
+ DrawLineInClient(WndNum,
+ pPos->x+pSize->cx-2, pPos->y+1,
+ pPos->x+pSize->cx-2, pPos->y+pSize->cy-2);
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+
+ //内部
+ DrawRectangleInClient(WndNum,
+ pPos->x+1,pPos->y+1,
+ pPos->x+pSize->cx-2,pPos->y+pSize->cy-2,
+ GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+ pPos->x+=3;
+ pPos->y+=2;
+ pSize->cx-=5;
+ pSize->cy-=4;
+}
+void DrawItemEdgeByExStyle(int WndNum,int ExStyle,POINT *pPos,SIZE *pSize){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ HPEN hPen,hOldPen;
+ RECT rect;
+
+ if(ExStyle&WS_EX_DLGMODALFRAME){
+ ///////////////////////////
+ //モーダル フレーム境界線
+
+ rect.left=pPos->x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.top=pPos->y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ rect.right=pPos->x+pSize->cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.bottom=pPos->y+pSize->cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ DrawEdge(MdiInfo[WndNum].MdiRadInfo->hMemDC,&rect,EDGE_RAISED,BF_RECT);
+ pPos->x+=2;
+ pPos->y+=2;
+ pSize->cx-=4;
+ pSize->cy-=4;
+
+ //細枠
+ DrawRectangleInClient(WndNum,
+ pPos->x,pPos->y,
+ pPos->x+pSize->cx,pPos->y+pSize->cy,
+ GetSysColor(COLOR_ACTIVEBORDER),0,0);
+
+ pPos->x+=1;
+ pPos->y+=1;
+ pSize->cx-=2;
+ pSize->cy-=2;
+ }
+ else if(ExStyle&WS_EX_STATICEDGE){
+ //////////////////////
+ //スタティック境界線
+
+ //影側の色
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ DrawLineInClient(WndNum,
+ pPos->x,
+ pPos->y,
+ pPos->x,
+ pPos->y+pSize->cy-1);
+ DrawLineInClient(WndNum,
+ pPos->x,
+ pPos->y,
+ pPos->x+pSize->cx-1,
+ pPos->y);
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+
+ //光源方向の縁
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ DrawLineInClient(WndNum,
+ pPos->x,
+ pPos->y+pSize->cy-1,
+ pPos->x+pSize->cx-1,
+ pPos->y+pSize->cy-1);
+ DrawLineInClient(WndNum,
+ pPos->x+pSize->cx-1,
+ pPos->y,
+ pPos->x+pSize->cx-1,
+ pPos->y+pSize->cy);
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+
+ pPos->x+=1;
+ pPos->y+=1;
+ pSize->cx-=2;
+ pSize->cy-=2;
+ }
+ if(ExStyle&WS_EX_CLIENTEDGE){
+ //////////////////////
+ //クライアント境界線
+
+ rect.left=pPos->x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.top=pPos->y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ rect.right=pPos->x+pSize->cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.bottom=pPos->y+pSize->cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ DrawEdge(MdiInfo[WndNum].MdiRadInfo->hMemDC,&rect,EDGE_SUNKEN,BF_RECT);
+ pPos->x+=2;
+ pPos->y+=2;
+ pSize->cx-=4;
+ pSize->cy-=4;
+ }
+}
+void DrawScrollBar(int WndNum,DWORD style,BOOL bSwitch,POINT *pPos,SIZE *pSize){
+ extern PROJECTINFO ProjectInfo;
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ int i,i2;
+ HPEN hPen,hOldPen;
+ COLORREF rgb;
+ POINT pos;
+ SIZE size;
+
+ if(bSwitch==0){
+ //水平スクロールバー
+
+ //左ボタン
+ if(pSize->cx>16*2){
+ pos=*pPos;
+ size.cx=16;
+ size.cy=pSize->cy;
+ }
+ else{
+ pos=*pPos;
+ size.cx=pSize->cx/2;
+ size.cy=pSize->cy;
+ }
+ DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+ //内部
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+ if(style&WS_DISABLED){
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ pos.x++;
+ pos.y++;
+ i2=pos.y+(size.cy/2);
+ for(i=0;i<4;i++,i2--){
+ DrawLineInClient(WndNum,i+pos.x+2,i2,i+pos.x+2,i2+(i*2)+1);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+ rgb=GetSysColor(COLOR_GRAYTEXT);
+ pos.x--;
+ pos.y--;
+ }
+ else rgb=GetSysColor(COLOR_BTNTEXT);
+ hPen=CreatePen(PS_SOLID,0,rgb);
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ i2=pos.y+(size.cy/2);
+ for(i=0;i<4;i++,i2--){
+ DrawLineInClient(WndNum,i+pos.x+2,i2,i+pos.x+2,i2+(i*2)+1);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+
+ //右ボタン
+ if(pSize->cx>16*2){
+ pos.x=pPos->x+pSize->cx-16;
+ pos.y=pPos->y;
+ size.cx=16;
+ size.cy=pSize->cy;
+ }
+ else{
+ pos.x=pPos->x+pSize->cx/2+pSize->cx%2;
+ pos.y=pPos->y;
+ size.cx=pSize->cx/2;
+ size.cy=pSize->cy;
+ }
+ DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+ //内部
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+ if(style&WS_DISABLED){
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ pos.x++;
+ pos.y++;
+ i2=pos.y+(size.cy/2);
+ for(i=3;i>=0;i--,i2--){
+ DrawLineInClient(WndNum,i+pos.x+3,i2,i+pos.x+3,i2+((3-i)*2)+1);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+ rgb=GetSysColor(COLOR_GRAYTEXT);
+ pos.x--;
+ pos.y--;
+ }
+ else rgb=GetSysColor(COLOR_BTNTEXT);
+ hPen=CreatePen(PS_SOLID,0,rgb);
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ i2=pos.y+(size.cy/2);
+ for(i=3;i>=0;i--,i2--){
+ DrawLineInClient(WndNum,i+pos.x+3,i2,i+pos.x+3,i2+((3-i)*2)+1);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+
+ if(pSize->cx>16*3){
+ if(!(style&WS_DISABLED)){
+ pos.x=pPos->x+16;
+ pos.y=pPos->y;
+ size.cx=16;
+ size.cy=pSize->cy;
+ DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+ //内部
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+ pos.x=pPos->x+16*2;
+ pos.y=pPos->y;
+ size.cx=pSize->cx-16*3;
+ size.cy=pSize->cy;
+ }
+ else{
+ pos.x=pPos->x+16;
+ pos.y=pPos->y;
+ size.cx=pSize->cx-16*2;
+ size.cy=pSize->cy;
+ }
+ }
+ else if(pSize->cx>16*2){
+ pos.x=pPos->x+16;
+ pos.y=pPos->y;
+ size.cx=pSize->cx-16*2;
+ size.cy=pSize->cy;
+ }
+ else{
+ pos.x=pPos->x+pSize->cx/2;
+ pos.y=pPos->y;
+ size.cx=pSize->cx%2;
+ size.cy=pSize->cy;
+ }
+ }
+ else{
+ //垂直スクロールバー
+
+ //上ボタン
+ if(pSize->cy>16*2){
+ pos=*pPos;
+ size.cy=16;
+ size.cx=pSize->cx;
+ }
+ else{
+ pos=*pPos;
+ size.cy=pSize->cy/2;
+ size.cx=pSize->cx;
+ }
+ DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+ //内部
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+ pos.y++;
+ if(style&WS_DISABLED){
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ pos.x++;
+ pos.y++;
+ i2=pos.x+(size.cx/2)-1;
+ for(i=0;i<4;i++,i2--){
+ DrawLineInClient(WndNum,i2,i+pos.y+2,i2+(i*2)+1,i+pos.y+2);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+ rgb=GetSysColor(COLOR_GRAYTEXT);
+ pos.x--;
+ pos.y--;
+ }
+ else rgb=GetSysColor(COLOR_BTNTEXT);
+ hPen=CreatePen(PS_SOLID,0,rgb);
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ i2=pos.x+(size.cx/2)-1;
+ for(i=0;i<4;i++,i2--){
+ DrawLineInClient(WndNum,i2,i+pos.y+2,i2+(i*2)+1,i+pos.y+2);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+
+ //下ボタン
+ if(pSize->cy>16*2){
+ pos.x=pPos->x;
+ pos.y=pPos->y+pSize->cy-16;
+ size.cx=pSize->cx;
+ size.cy=16;
+ }
+ else{
+ pos.x=pPos->x;
+ pos.y=pPos->y+pSize->cy/2+pSize->cy%2;
+ size.cx=pSize->cx;
+ size.cy=pSize->cy/2;
+ }
+ DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+ //内部
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+ pos.x--;
+ if(style&WS_DISABLED){
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ pos.x++;
+ pos.y++;
+ i2=pos.x+(size.cx/2);
+ for(i=3;i>=0;i--,i2--){
+ DrawLineInClient(WndNum,i2,i+pos.y+3,i2+((3-i)*2)+1,i+pos.y+3);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+ rgb=GetSysColor(COLOR_GRAYTEXT);
+ pos.x--;
+ pos.y--;
+ }
+ else rgb=GetSysColor(COLOR_BTNTEXT);
+ hPen=CreatePen(PS_SOLID,0,rgb);
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ i2=pos.x+(size.cx/2);
+ for(i=3;i>=0;i--,i2--){
+ DrawLineInClient(WndNum,i2,i+pos.y+3,i2+((3-i)*2)+1,i+pos.y+3);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+
+ if(pSize->cy>16*3){
+ if(!(style&WS_DISABLED)){
+ pos.x=pPos->x;
+ pos.y=pPos->y+16;
+ size.cx=pSize->cx;
+ size.cy=16;
+ DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+ //内部
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+ pos.x=pPos->x;
+ pos.y=pPos->y+16*2;
+ size.cx=pSize->cx;
+ size.cy=pSize->cy-16*3;
+ }
+ else{
+ pos.x=pPos->x;
+ pos.y=pPos->y+16;
+ size.cx=pSize->cx;
+ size.cy=pSize->cy-16*2;
+ }
+ }
+ else if(pSize->cy>16*2){
+ pos.x=pPos->x;
+ pos.y=pPos->y+16;
+ size.cx=pSize->cx;
+ size.cy=pSize->cy-16*2;
+ }
+ else{
+ pos.x=pPos->x;
+ pos.y=pPos->y+pSize->cy/2;
+ size.cx=pSize->cx;
+ size.cy=pSize->cy%2;
+ }
+ }
+
+ if(size.cx){
+ int x,y;
+ HBITMAP hBitmap;
+ BITMAPINFO BitmapInfo;
+ BYTE *pByte;
+
+ memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
+ BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
+ BitmapInfo.bmiHeader.biWidth=size.cx;
+ BitmapInfo.bmiHeader.biHeight=size.cy;
+ BitmapInfo.bmiHeader.biPlanes=1;
+ BitmapInfo.bmiHeader.biBitCount=24;
+
+ hBitmap=CreateDIBSection(MdiInfo[WndNum].MdiRadInfo->hMemDC,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);
+ i=BitmapInfo.bmiHeader.biWidth*3;
+ if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
+ for(y=0;yhMemDC,
+ pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
+ pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
+ BitmapInfo.bmiHeader.biWidth, BitmapInfo.bmiHeader.biHeight,
+ 0,0,
+ 0,BitmapInfo.bmiHeader.biHeight,
+ pByte,
+ &BitmapInfo,
+ DIB_RGB_COLORS);
+ DeleteObject(hBitmap);
+ }
+}
+void DrawUpDownControl(int WndNum,DWORD style,BOOL bSwitch,POINT *pPos,SIZE *pSize){
+ extern PROJECTINFO ProjectInfo;
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ int i,i2;
+ HPEN hPen,hOldPen;
+ COLORREF rgb;
+ POINT pos;
+ SIZE size;
+
+ if(bSwitch==0){
+ //水平
+
+ //左ボタン
+ pos=*pPos;
+ size.cx=pSize->cx/2;
+ size.cy=pSize->cy;
+ DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+ //内部
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+ if(style&WS_DISABLED){
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ pos.x++;
+ pos.y++;
+ i2=pos.y+(size.cy/2);
+ for(i=0;i<4;i++,i2--){
+ DrawLineInClient(WndNum,i+pos.x+2,i2,i+pos.x+2,i2+(i*2)+1);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+ rgb=GetSysColor(COLOR_GRAYTEXT);
+ pos.x--;
+ pos.y--;
+ }
+ else rgb=GetSysColor(COLOR_BTNTEXT);
+ hPen=CreatePen(PS_SOLID,0,rgb);
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ i2=pos.y+(size.cy/2);
+ for(i=0;i<4;i++,i2--){
+ DrawLineInClient(WndNum,i+pos.x+2,i2,i+pos.x+2,i2+(i*2)+1);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+
+ //右ボタン
+ pos.x=pPos->x+pSize->cx/2+pSize->cx%2;
+ pos.y=pPos->y;
+ size.cx=pSize->cx/2;
+ size.cy=pSize->cy;
+ DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+ //内部
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+ if(style&WS_DISABLED){
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ pos.x++;
+ pos.y++;
+ i2=pos.y+(size.cy/2);
+ for(i=3;i>=0;i--,i2--){
+ DrawLineInClient(WndNum,i+pos.x+3,i2,i+pos.x+3,i2+((3-i)*2)+1);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+ rgb=GetSysColor(COLOR_GRAYTEXT);
+ pos.x--;
+ pos.y--;
+ }
+ else rgb=GetSysColor(COLOR_BTNTEXT);
+ hPen=CreatePen(PS_SOLID,0,rgb);
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ i2=pos.y+(size.cy/2);
+ for(i=3;i>=0;i--,i2--){
+ DrawLineInClient(WndNum,i+pos.x+3,i2,i+pos.x+3,i2+((3-i)*2)+1);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+ }
+ else{
+ //垂直
+
+ //上ボタン
+ pos=*pPos;
+ size.cy=pSize->cy/2;
+ size.cx=pSize->cx;
+ DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+ //内部
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+ pos.y++;
+ if(style&WS_DISABLED){
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ pos.x++;
+ pos.y++;
+ i2=pos.x+(size.cx/2)-1;
+ for(i=0;i<4;i++,i2--){
+ DrawLineInClient(WndNum,i2,i+pos.y+2,i2+(i*2)+1,i+pos.y+2);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+ rgb=GetSysColor(COLOR_GRAYTEXT);
+ pos.x--;
+ pos.y--;
+ }
+ else rgb=GetSysColor(COLOR_BTNTEXT);
+ hPen=CreatePen(PS_SOLID,0,rgb);
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ i2=pos.x+(size.cx/2)-1;
+ for(i=0;i<4;i++,i2--){
+ DrawLineInClient(WndNum,i2,i+pos.y+2,i2+(i*2)+1,i+pos.y+2);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+
+ //下ボタン
+ pos.x=pPos->x;
+ pos.y=pPos->y+pSize->cy/2+pSize->cy%2;
+ size.cx=pSize->cx;
+ size.cy=pSize->cy/2;
+ DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+ //内部
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+ pos.x--;
+ if(style&WS_DISABLED){
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ pos.x++;
+ pos.y++;
+ i2=pos.x+(size.cx/2);
+ for(i=3;i>=0;i--,i2--){
+ DrawLineInClient(WndNum,i2,i+pos.y+3,i2+((3-i)*2)+1,i+pos.y+3);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+ rgb=GetSysColor(COLOR_GRAYTEXT);
+ pos.x--;
+ pos.y--;
+ }
+ else rgb=GetSysColor(COLOR_BTNTEXT);
+ hPen=CreatePen(PS_SOLID,0,rgb);
+ hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
+ i2=pos.x+(size.cx/2);
+ for(i=3;i>=0;i--,i2--){
+ DrawLineInClient(WndNum,i2,i+pos.y+3,i2+((3-i)*2)+1,i+pos.y+3);
+ }
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
+ DeleteObject(hPen);
+ }
+}
+void DrawWindowScrollBar(int WndNum,DWORD style,POINT *pPos,SIZE *pSize){
+ POINT pos;
+ SIZE size;
+ if(style&WS_HSCROLL){
+ pos.x=pPos->x;
+ pos.y=pPos->y+pSize->cy-GetSystemMetrics(SM_CYVSCROLL);
+ if(style&WS_VSCROLL) size.cx=pSize->cx-GetSystemMetrics(SM_CXVSCROLL);
+ else size.cx=pSize->cx;
+ size.cy=GetSystemMetrics(SM_CYVSCROLL);
+ DrawScrollBar(WndNum,style,0,&pos,&size);
+ }
+ if(style&WS_VSCROLL){
+ pos.x=pPos->x+pSize->cx-GetSystemMetrics(SM_CXHSCROLL);
+ pos.y=pPos->y;
+ size.cx=GetSystemMetrics(SM_CXHSCROLL);
+ if(style&WS_HSCROLL) size.cy=pSize->cy-GetSystemMetrics(SM_CYHSCROLL);
+ else size.cy=pSize->cy;
+ DrawScrollBar(WndNum,style,1,&pos,&size);
+ }
+}
+void DrawOEMImage(HDC hdc,POINT *pPos,SIZE *pSize,DWORD dwImage){
+ HBITMAP hBmp,hOldBmp;
+ HDC memdc;
+
+ //未完成(XPのみに対応?)
+
+ memdc=CreateCompatibleDC(hdc);
+ hBmp=LoadBitmap(NULL,(LPSTR)dwImage);
+ hOldBmp=(HBITMAP)SelectObject(memdc,hBmp);
+ BitBlt(hdc,pPos->x,pPos->y,pSize->cx,pSize->cy,memdc,0,0,SRCCOPY);
+ SelectObject(memdc,hOldBmp);
+ DeleteDC(memdc);
+ DeleteObject(hBmp);
+}
+void DesigningWindow(int WndNum,HDC hdc,POINT *pBasePos,WINDOW_INFO *pWindowInfo){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ extern PROJECTINFO ProjectInfo;
+ int i,i2,i3,i4;
+ double red,green,blue,d_red,d_green,d_blue;
+ char temporary[MAX_PATH];
+ COLORREF rgb;
+ HPEN hPen,hOldPen;
+ HBRUSH hBrush,hOldBrush;
+ HFONT hFont,hOldFont;
+ HANDLE hImage;
+ RECT InsideRect,rect,rc2;
+ POINT pos,pos2;
+ SIZE size,size2;
+
+ HGLOBAL hResource;
+ BITMAPINFO *pBitmapInfo;
+ BYTE *pByte,*pByte2;
+
+
+ ////////////////////////
+ //ウィンドウの縁を描画
+ InsideRect.left=pBasePos->x;
+ InsideRect.top=pBasePos->y;
+ InsideRect.right=InsideRect.left+pWindowInfo->size.cx;
+ InsideRect.bottom=InsideRect.top+pWindowInfo->size.cy;
+
+ if(pWindowInfo->style&(WS_BORDER|WS_THICKFRAME)){
+ DrawEdge(hdc,&InsideRect,EDGE_RAISED,BF_RECT);
+
+ InsideRect.left+=2;
+ InsideRect.top+=2;
+ InsideRect.right-=2;
+ InsideRect.bottom-=2;
+ }
+
+
+ ////////////
+ //枠を描画
+ if(pWindowInfo->style&(WS_BORDER|WS_THICKFRAME)){
+ //細枠
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_ACTIVEBORDER));
+ hBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
+ hOldPen=(HPEN)SelectObject(hdc,hPen);
+ hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+ Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
+
+ InsideRect.left+=1;
+ InsideRect.top+=1;
+ InsideRect.right-=1;
+ InsideRect.bottom-=1;
+
+ //サイズ変更枠
+ if(pWindowInfo->style&WS_THICKFRAME){
+ Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
+
+ InsideRect.left+=1;
+ InsideRect.top+=1;
+ InsideRect.right-=1;
+ InsideRect.bottom-=1;
+ }
+ SelectObject(hdc,hOldPen);
+ SelectObject(hdc,hOldBrush);
+ DeleteObject(hPen);
+ DeleteObject(hBrush);
+ }
+
+
+ //Draw...InClient関数のため
+ MdiInfo[WndNum].MdiRadInfo->ClientPos.x=0;
+ MdiInfo[WndNum].MdiRadInfo->ClientPos.y=0;
+
+ if(pWindowInfo->style&(WS_CAPTION&(~WS_BORDER))){
+ //////////////////////
+ //タイトルバーを描画
+
+ //背景を描画(グラデーション可)
+ i=GetSysColor(COLOR_ACTIVECAPTION);
+ OSVERSIONINFO OsVersionInfo;
+ OsVersionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
+ GetVersionEx(&OsVersionInfo);
+ if((OsVersionInfo.dwPlatformId==VER_PLATFORM_WIN32_NT&&OsVersionInfo.dwMajorVersion>=5)||
+ (OsVersionInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS&&LOWORD(OsVersionInfo.dwBuildNumber)>=1998)){
+#define COLOR_GRADIENTACTIVECAPTION 27
+ i2=GetSysColor(COLOR_GRADIENTACTIVECAPTION);
+ }
+ else i2=i;
+ if(pWindowInfo->ExStyle&WS_EX_TOOLWINDOW)
+ i3=GetSystemMetrics(SM_CYSMCAPTION);
+ else i3=GetSystemMetrics(SM_CYCAPTION);
+ d_red=((double)((i2&0xFF)-(i&0xFF)))/(double)(InsideRect.right-InsideRect.left);
+ d_green=((double)(((i2>>8)&0xFF))-((i>>8)&0xFF))/(double)(InsideRect.right-InsideRect.left);
+ d_blue=((double)(((i2>>16)&0xFF))-((i>>16)&0xFF))/(double)(InsideRect.right-InsideRect.left);
+
+ red=(double)(i&0xFF);
+ green=(double)((i>>8)&0xFF);
+ blue=(double)((i>>16)&0xFF);
+ for(i4=InsideRect.left;i4caption,lstrlen(pWindowInfo->caption),&rect,DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX);
+ SelectObject(hdc,hOldFont);
+ DeleteObject(hFont);
+
+ //ボタン
+ if(pWindowInfo->style&WS_SYSMENU){
+ //終了ボタン
+ size.cx=GetSystemMetrics(SM_CXSIZE)-2;
+ size.cy=GetSystemMetrics(SM_CYSIZE)-4;
+ pos.x=InsideRect.right-2-size.cx;
+ pos.y=InsideRect.top+2;
+ DrawButtonEdge(WndNum,&pos,&size);
+
+ hResource=LoadResource(hResInst,FindResource(hResInst,MAKEINTRESOURCE(IDB_TITLE_BUTTON_CLOSE),RT_BITMAP));
+ pBitmapInfo=(BITMAPINFO *)LockResource(hResource);
+ pByte=(BYTE *)pBitmapInfo+pBitmapInfo->bmiHeader.biSize;
+
+ i2=pBitmapInfo->bmiHeader.biWidth*3;
+ if(i2%sizeof(LONG)!=0) i2+=sizeof(LONG)-(i2%sizeof(LONG));
+ pByte2=(BYTE *)GlobalAlloc(GMEM_FIXED,pBitmapInfo->bmiHeader.biHeight*i2);
+ int x,y;
+ for(y=0;ybmiHeader.biHeight;y++){
+ if(y%2==0) rgb=GetSysColor(COLOR_3DFACE);
+ else rgb=RGB(255,255,255);
+ for(x=0;xbmiHeader.biWidth;x++){
+ i4=y*i2+x*3;
+ rgb=RGB(pByte[i4+2],pByte[i4+1],pByte[i4]);
+ if(rgb==RGB(0,0,0)){
+ rgb=GetSysColor(COLOR_BTNTEXT);
+ pByte2[i4+2]=LOBYTE(LOWORD(rgb));
+ pByte2[i4+1]=HIBYTE(LOWORD(rgb));
+ pByte2[i4]=LOBYTE(HIWORD(rgb));
+ }
+ else if(rgb==RGB(255,255,255)){
+ rgb=GetSysColor(COLOR_3DFACE);
+ pByte2[i4+2]=LOBYTE(LOWORD(rgb));
+ pByte2[i4+1]=HIBYTE(LOWORD(rgb));
+ pByte2[i4]=LOBYTE(HIWORD(rgb));
+ }
+ }
+ }
+ SetStretchBltMode(hdc,COLORONCOLOR);
+ StretchDIBits(hdc,
+ pos.x+(int)((double)size.cx*0.17), pos.y+(int)((double)size.cy*0.17),
+ (int)((double)size.cx*0.65)+1, (int)((double)size.cy*0.65)+1,
+ 0,0,
+ pBitmapInfo->bmiHeader.biWidth,pBitmapInfo->bmiHeader.biHeight,
+ pByte2,
+ pBitmapInfo,
+ DIB_RGB_COLORS,SRCCOPY);
+ GlobalFree(pByte2);
+
+ if(pWindowInfo->style&WS_MAXIMIZEBOX||pWindowInfo->style&WS_MINIMIZEBOX){
+ //最大化ボタン
+ size.cx=GetSystemMetrics(SM_CXSIZE)-2;
+ size.cy=GetSystemMetrics(SM_CYSIZE)-4;
+ pos.x=InsideRect.right-size.cx*2-4;
+ pos.y=InsideRect.top+2;
+ DrawButtonEdge(WndNum,&pos,&size);
+ if(!(pWindowInfo->style&WS_MAXIMIZEBOX)){
+ pos.x++;
+ pos.y++;
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(hdc,hPen);
+ hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
+ Rectangle(hdc,pos.x,pos.y,pos.x+size.cx-2,pos.y+size.cy-1);
+ MoveToEx(hdc,pos.x,pos.y+1,NULL);
+ LineTo(hdc,pos.x+size.cx-2,pos.y+1);
+ SelectObject(hdc,hOldPen);
+ SelectObject(hdc,hOldBrush);
+ DeleteObject(hPen);
+ pos.x--;
+ pos.y--;
+ rgb=GetSysColor(COLOR_GRAYTEXT);
+ }
+ else rgb=GetSysColor(COLOR_BTNTEXT);
+ hPen=CreatePen(PS_SOLID,0,rgb);
+ hOldPen=(HPEN)SelectObject(hdc,hPen);
+ hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
+ Rectangle(hdc,pos.x,pos.y,pos.x+size.cx-2,pos.y+size.cy-1);
+ MoveToEx(hdc,pos.x,pos.y+1,NULL);
+ LineTo(hdc,pos.x+size.cx-2,pos.y+1);
+ SelectObject(hdc,hOldPen);
+ SelectObject(hdc,hOldBrush);
+ DeleteObject(hPen);
+
+ //最小化ボタン
+ size.cx=GetSystemMetrics(SM_CXSIZE)-2;
+ size.cy=GetSystemMetrics(SM_CYSIZE)-4;
+ pos.x=InsideRect.right-size.cx*3-4;
+ pos.y=InsideRect.top+2;
+ DrawButtonEdge(WndNum,&pos,&size);
+ if(!(pWindowInfo->style&WS_MINIMIZEBOX)){
+ pos.x++;
+ pos.y++;
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(hdc,hPen);
+ MoveToEx(hdc,pos.x+1,pos.y+size.cy-2,NULL);
+ LineTo(hdc,pos.x+size.cy-3,pos.y+size.cy-2);
+ MoveToEx(hdc,pos.x+1,pos.y+size.cy-3,NULL);
+ LineTo(hdc,pos.x+size.cy-3,pos.y+size.cy-3);
+ SelectObject(hdc,hOldPen);
+ DeleteObject(hPen);
+ pos.x--;
+ pos.y--;
+ rgb=GetSysColor(COLOR_GRAYTEXT);
+ }
+ else rgb=GetSysColor(COLOR_BTNTEXT);
+ hPen=CreatePen(PS_SOLID,0,rgb);
+ hOldPen=(HPEN)SelectObject(hdc,hPen);
+ MoveToEx(hdc,pos.x+1,pos.y+size.cy-2,NULL);
+ LineTo(hdc,pos.x+size.cy-3,pos.y+size.cy-2);
+ MoveToEx(hdc,pos.x+1,pos.y+size.cy-3,NULL);
+ LineTo(hdc,pos.x+size.cy-3,pos.y+size.cy-3);
+ SelectObject(hdc,hOldPen);
+ DeleteObject(hPen);
+ }
+ }
+
+ InsideRect.top+=i3;
+ }
+
+ if(pWindowInfo->MenuID){
+ //メニューラインを3DFACEで描画
+ rgb=GetSysColor(COLOR_3DFACE);
+ i=GetSystemMetrics(SM_CYMENU);
+ hPen=CreatePen(PS_SOLID,0,rgb);
+ hBrush=CreateSolidBrush(rgb);
+ hOldPen=(HPEN)SelectObject(hdc,hPen);
+ hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+ Rectangle(hdc,
+ InsideRect.left,InsideRect.top-1,InsideRect.right,InsideRect.top+i);
+ SelectObject(hdc,hOldPen);
+ SelectObject(hdc,hOldBrush);
+ DeleteObject(hPen);
+ DeleteObject(hBrush);
+
+ InsideRect.top+=i;
+ }
+
+ //クライアント左上ポジションを設定
+ MdiInfo[WndNum].MdiRadInfo->ClientPos.x=InsideRect.left;
+ MdiInfo[WndNum].MdiRadInfo->ClientPos.y=InsideRect.top;
+
+ //ExStyleによる縁を描画
+ pos.x=0;
+ pos.y=0;
+ size.cx=InsideRect.right-InsideRect.left;
+ size.cy=InsideRect.bottom-InsideRect.top;
+ DrawItemEdgeByExStyle(WndNum,pWindowInfo->ExStyle,&pos,&size);
+
+ //スクロールバーを描画
+ DrawWindowScrollBar(WndNum,pWindowInfo->style,&pos,&size);
+
+ //クライアント領域のサイズを設定
+ MdiInfo[WndNum].MdiRadInfo->ClientSize=size;
+
+
+ //////////////
+ //背景を描画
+ if(pWindowInfo->bgColor==COLOR_3DFACE){
+ //3DFACE
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DFACE));
+ hBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
+ hOldPen=(HPEN)SelectObject(hdc,hPen);
+ hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+ Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
+ SelectObject(hdc,hOldPen);
+ SelectObject(hdc,hOldBrush);
+ DeleteObject(hPen);
+ DeleteObject(hBrush);
+ }
+ else if(pWindowInfo->bgColor<=0){
+ //色指定
+ hPen=CreatePen(PS_SOLID,0,-pWindowInfo->bgColor);
+ hBrush=CreateSolidBrush(-pWindowInfo->bgColor);
+ hOldPen=(HPEN)SelectObject(hdc,hPen);
+ hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+ Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
+ SelectObject(hdc,hOldPen);
+ SelectObject(hdc,hOldBrush);
+ DeleteObject(hPen);
+ DeleteObject(hBrush);
+ }
+ else if(pWindowInfo->bgColor>=0x1000){
+ //ビットマップ
+ for(i2=0;i2bgColor-0x1000].IdName,
+ ProjectInfo.res.pBitmapResInfo[i2].IdName)==0) break;
+ }
+ if(i2!=ProjectInfo.res.NumberOfBitmapRes){
+ lstrcpy(temporary,ProjectInfo.res.pBitmapResInfo[i2].path);
+ GetFullPath(temporary,ProjectInfo.dir);
+ hImage=LoadImage(NULL,temporary,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
+
+ hBrush=CreatePatternBrush((HBITMAP)hImage);
+ hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+ SetBrushOrgEx(hdc,InsideRect.left,InsideRect.top,&pos);
+ PatBlt(hdc,
+ InsideRect.left, InsideRect.top,
+ InsideRect.right-InsideRect.left, InsideRect.bottom-InsideRect.top,PATCOPY);
+ SetBrushOrgEx(hdc,pos.x,pos.y,0);
+ SelectObject(hdc,hOldBrush);
+ DeleteObject(hBrush);
+ DeleteObject(hImage);
+ }
+ }
+
+
+ ////////////////////////////////////////////
+ //子ウィンドウ(ダイアログアイテム)を描画
+ hFont=CreateFontIndirect(&pWindowInfo->LogFont);
+ for(i=0;iNumberOfChildWindows;i++){
+ pos=pWindowInfo->pChildInfo[i].pos;
+ size=pWindowInfo->pChildInfo[i].size;
+
+ //ExStyleによる縁を描画
+ DrawItemEdgeByExStyle(WndNum,pWindowInfo->pChildInfo[i].ExStyle,&pos,&size);
+
+ if(pWindowInfo->pChildInfo[i].Control==CT_BUTTON){
+ ////////////////////////
+ // Button コントロール
+
+ if((pWindowInfo->pChildInfo[i].style&0x0000000F)==BS_DEFPUSHBUTTON){
+ //標準のボタンの場合(黒枠描画)
+ DrawRectangleInClient(WndNum,
+ pos.x, pos.y,
+ pos.x+size.cx, pos.y+size.cy,
+ RGB(0,0,0),0,0);
+ pos.x++;
+ pos.y++;
+ size.cx-=2;
+ size.cy-=2;
+ }
+
+ //ボタンの縁を描画
+ DrawButtonEdge(WndNum,&pos,&size);
+
+ if(!(pWindowInfo->pChildInfo[i].style&(BS_ICON|BS_BITMAP))){
+ //キャプション テキスト
+
+ rect.left=pos.x+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.top=pos.y+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ rect.right=pos.x+size.cx-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.bottom=pos.y+size.cy-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+
+ if(pWindowInfo->pChildInfo[i].style&BS_MULTILINE) i4=0;
+ else i4=DT_SINGLELINE;
+
+ //ビットを考慮してBS_CENTERを最初に比較する
+ if((pWindowInfo->pChildInfo[i].style&BS_CENTER)==BS_CENTER) i2=DT_CENTER;
+ else if(pWindowInfo->pChildInfo[i].style&BS_LEFT) i2=DT_LEFT;
+ else if(pWindowInfo->pChildInfo[i].style&BS_RIGHT) i2=DT_RIGHT;
+ else i2=DT_CENTER;
+
+ //ビットを考慮してBS_VCENTERを最初に比較する
+ if((pWindowInfo->pChildInfo[i].style&BS_VCENTER)==BS_VCENTER) i3=DT_VCENTER;
+ else if(pWindowInfo->pChildInfo[i].style&BS_TOP) i3=DT_TOP;
+ else if(pWindowInfo->pChildInfo[i].style&BS_BOTTOM) i3=DT_BOTTOM;
+ else i3=DT_VCENTER;
+
+ hOldFont=(HFONT)SelectObject(hdc,hFont);
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED){
+ SetTextColor(hdc,RGB(255,255,255));
+ rc2.left=rect.left+1;
+ rc2.top=rect.top+1;
+ rc2.right=rect.right+1;
+ rc2.bottom=rect.bottom+1;
+ DrawText(hdc,pWindowInfo->pChildInfo[i].caption,-1,&rc2,i4|i2|i3);
+ SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
+ }
+ else SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
+
+ DrawText(hdc,pWindowInfo->pChildInfo[i].caption,-1,&rect,i4|i2|i3);
+ SelectObject(hdc,hOldFont);
+ }
+ }
+ else if(pWindowInfo->pChildInfo[i].Control==CT_CHECKBOX){
+ //////////////////////////
+ // CheckBox コントロール
+
+ if(pWindowInfo->pChildInfo[i].style&BS_PUSHLIKE){
+ //ボタンの縁を描画
+ DrawButtonEdge(WndNum,&pos,&size);
+ }
+ else{
+ //チェックボックスを描画
+ size2.cx=13;
+ size2.cy=13;
+ if(pWindowInfo->pChildInfo[i].style&BS_LEFTTEXT)
+ pos2.x=pos.x+size.cx-size2.cx;
+ else pos2.x=pos.x;
+ if((pWindowInfo->pChildInfo[i].style&BS_VCENTER)==BS_VCENTER||
+ (pWindowInfo->pChildInfo[i].style&BS_VCENTER)==0)
+ pos2.y=pos.y+(size.cy/2)-(size2.cy/2);
+ else if(pWindowInfo->pChildInfo[i].style&BS_TOP)
+ pos2.y=pos.y+1;
+ else if(pWindowInfo->pChildInfo[i].style&BS_BOTTOM)
+ pos2.y=pos.y+size.cy-size2.cy-1;
+ DrawItemEdgeByExStyle(WndNum,WS_EX_CLIENTEDGE,&pos2,&size2);
+
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED)
+ rgb=GetSysColor(COLOR_3DFACE);
+ else rgb=GetSysColor(COLOR_WINDOW);
+ DrawRectangleInClient(WndNum,pos2.x, pos2.y,
+ pos2.x+size2.cx, pos2.y+size2.cy,
+ rgb,rgb,1);
+ if(!(pWindowInfo->pChildInfo[i].style&BS_LEFTTEXT)) pos.x+=17;
+ else pos.x++;
+ size.cx-=17;
+ }
+
+ if(!(pWindowInfo->pChildInfo[i].style&(BS_ICON|BS_BITMAP))){
+ //キャプション テキスト
+ rect.left=pos.x+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.top=pos.y+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ rect.right=pos.x+size.cx-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.bottom=pos.y+size.cy-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+
+ if(pWindowInfo->pChildInfo[i].style&BS_MULTILINE) i4=0;
+ else i4=DT_SINGLELINE;
+
+ //ビットを考慮してBS_CENTERを最初に比較する
+ if((pWindowInfo->pChildInfo[i].style&BS_CENTER)==BS_CENTER) i2=DT_CENTER;
+ else if(pWindowInfo->pChildInfo[i].style&BS_LEFT) i2=DT_LEFT;
+ else if(pWindowInfo->pChildInfo[i].style&BS_RIGHT) i2=DT_RIGHT;
+ else i2=DT_LEFT;
+
+ //ビットを考慮してBS_VCENTERを最初に比較する
+ if((pWindowInfo->pChildInfo[i].style&BS_VCENTER)==BS_VCENTER) i3=DT_VCENTER;
+ else if(pWindowInfo->pChildInfo[i].style&BS_TOP) i3=DT_TOP;
+ else if(pWindowInfo->pChildInfo[i].style&BS_BOTTOM) i3=DT_BOTTOM;
+ else i3=DT_VCENTER;
+
+ hOldFont=(HFONT)SelectObject(hdc,hFont);
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED){
+ SetTextColor(hdc,RGB(255,255,255));
+ rc2.left=rect.left+1;
+ rc2.top=rect.top+1;
+ rc2.right=rect.right+1;
+ rc2.bottom=rect.bottom+1;
+ DrawText(hdc,pWindowInfo->pChildInfo[i].caption,-1,&rc2,i4|i2|i3);
+ SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
+ }
+ else SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
+
+ DrawText(hdc,pWindowInfo->pChildInfo[i].caption,-1,&rect,i4|i2|i3);
+ SelectObject(hdc,hOldFont);
+ }
+ }
+ else if(pWindowInfo->pChildInfo[i].Control==CT_COMBOBOX){
+ //////////////////////////
+ // ComboBox コントロール
+
+ pos2=pos;
+ size2.cx=size.cx;
+ size2.cy=20;
+ DrawItemEdgeByExStyle(WndNum,WS_EX_CLIENTEDGE,&pos2,&size2);
+
+ //内部
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED)
+ rgb=GetSysColor(COLOR_3DFACE);
+ else rgb=GetSysColor(COLOR_WINDOW);
+ DrawRectangleInClient(WndNum,
+ pos2.x,pos2.y,
+ pos2.x+size2.cx,pos2.y+size2.cy,
+ rgb,rgb,1);
+
+ if((pWindowInfo->pChildInfo[i].style&0x000F)==CBS_SIMPLE){
+ pos.y+=20;
+ size.cy-=20;
+ DrawItemEdgeByExStyle(WndNum,WS_EX_CLIENTEDGE,&pos,&size);
+
+ //内部
+ rgb=GetSysColor(COLOR_WINDOW);
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ rgb,rgb,1);
+ }
+ else{
+ //下ボタン
+ pos2.x+=size2.cx-16;
+ size2.cx=16;
+ size2.cy=16;
+ DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos2,&size2);
+
+ //内部
+ DrawRectangleInClient(WndNum,
+ pos2.x,pos2.y,
+ pos2.x+size2.cx,pos2.y+size2.cy,
+ GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+ pos2.x--;
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED){
+ hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+ hOldPen=(HPEN)SelectObject(hdc,hPen);
+ pos2.x++;
+ pos2.y++;
+ i3=pos2.x+(size2.cx/2);
+ for(i2=3;i2>=0;i2--,i3--){
+ DrawLineInClient(WndNum,i3,i2+pos2.y+3,i3+((3-i2)*2)+1,i2+pos2.y+3);
+ }
+ SelectObject(hdc,hOldPen);
+ DeleteObject(hPen);
+ rgb=GetSysColor(COLOR_GRAYTEXT);
+ pos2.x--;
+ pos2.y--;
+ }
+ else rgb=GetSysColor(COLOR_BTNTEXT);
+ hPen=CreatePen(PS_SOLID,0,rgb);
+ hOldPen=(HPEN)SelectObject(hdc,hPen);
+ i3=pos2.x+(size2.cx/2);
+ for(i2=3;i2>=0;i2--,i3--){
+ DrawLineInClient(WndNum,i3,i2+pos2.y+3,i3+((3-i2)*2)+1,i2+pos2.y+3);
+ }
+ SelectObject(hdc,hOldPen);
+ DeleteObject(hPen);
+ }
+ }
+ else if(pWindowInfo->pChildInfo[i].Control==CT_EDIT){
+ //////////////////////
+ // Edit コントロール
+
+ //内部
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED||pWindowInfo->pChildInfo[i].style&ES_READONLY)
+ rgb=GetSysColor(COLOR_3DFACE);
+ else rgb=GetSysColor(COLOR_WINDOW);
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ rgb,rgb,1);
+
+ //キャプション テキスト
+ rect.left=pos.x+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.top=pos.y+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ rect.right=pos.x+size.cx-1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.bottom=pos.y+size.cy-1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+
+ if(pWindowInfo->pChildInfo[i].style&ES_MULTILINE) i4=0;
+ else i4=DT_SINGLELINE;
+
+ //ビットを考慮してES_LEFTを最後に検討する
+ if(pWindowInfo->pChildInfo[i].style&ES_CENTER) i2=DT_CENTER;
+ else if(pWindowInfo->pChildInfo[i].style&ES_RIGHT) i2=DT_RIGHT;
+ else i2=DT_LEFT;
+
+ //文字色を設定
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED)
+ SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
+ else
+ SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
+
+ hOldFont=(HFONT)SelectObject(hdc,hFont);
+ DrawText(hdc,pWindowInfo->pChildInfo[i].caption,-1,&rect,i4|i2);
+ SelectObject(hdc,hOldFont);
+ }
+
+ else if(pWindowInfo->pChildInfo[i].Control==CT_GROUPBOX){
+ ///////////////////////////////////
+ // グループ ボックス コントロール
+
+ hOldFont=(HFONT)SelectObject(hdc,hFont);
+ GetTextExtentPoint32(hdc,pWindowInfo->pChildInfo[i].caption,lstrlen(pWindowInfo->pChildInfo[i].caption),&size2);
+
+ //枠を描画
+ rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y+(size2.cy/2);
+ rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ DrawEdge(hdc,&rect,EDGE_ETCHED,BF_RECT);
+
+ //ビットを考慮してBS_CENTERを最初に検討する
+ if((pWindowInfo->pChildInfo[i].style&BS_CENTER)==BS_CENTER){
+ rect.left=pos.x+(size.cx/2)-(size2.cx/2)-3;
+ rect.right=rect.left+size2.cx+4;
+ }
+ else if(pWindowInfo->pChildInfo[i].style&BS_RIGHT){
+ rect.right=pos.x+size.cx-7;
+ rect.left=rect.right-size2.cx-4;
+ }
+ else{
+ rect.left=pos.x+7;
+ rect.right=rect.left+size2.cx+4;
+ }
+ rect.top=pos.y;
+ rect.bottom=pos.y+size2.cy;
+
+ if(pWindowInfo->bgColor==COLOR_3DFACE) rgb=GetSysColor(COLOR_3DFACE);
+ else rgb=-pWindowInfo->bgColor;
+ DrawRectangleInClient(WndNum,rect.left,rect.top,rect.right,rect.bottom,rgb,rgb,1);
+
+ if(!((pWindowInfo->pChildInfo[i].style&BS_ICON)||(pWindowInfo->pChildInfo[i].style&BS_BITMAP))){
+ rect.left+=MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.top+=MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ rect.right+=MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.bottom+=MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ rect.left+=2;
+ rect.right-=2;
+
+ //テキストを描画
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED){
+ SetTextColor(hdc,RGB(255,255,255));
+ rc2.left=rect.left+1;
+ rc2.top=rect.top+1;
+ rc2.right=rect.right+1;
+ rc2.bottom=rect.bottom+1;
+ DrawText(hdc,pWindowInfo->pChildInfo[i].caption,-1,&rc2,DT_SINGLELINE);
+ SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
+ }
+ else
+ SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
+
+ DrawText(hdc,pWindowInfo->pChildInfo[i].caption,-1,&rect,DT_SINGLELINE);
+ }
+ SelectObject(hdc,hOldFont);
+ }
+
+ else if(pWindowInfo->pChildInfo[i].Control==CT_HSCROLLBAR){
+ ////////////////////////////////////
+ // 水平スクロールバー コントロール
+ DrawScrollBar(WndNum,pWindowInfo->pChildInfo[i].style,0,&pos,&size);
+ }
+
+ else if(pWindowInfo->pChildInfo[i].Control==CT_IMAGEBOX){
+ /////////////////////
+ // イメージ ボックス
+ HDC memdc;
+
+ if((pWindowInfo->pChildInfo[i].style&0x0000000F)==SS_BLACKFRAME)
+ DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(0,0,0),0,0);
+ else if((pWindowInfo->pChildInfo[i].style&0x0000000F)==SS_GRAYFRAME)
+ DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,GetSysColor(COLOR_3DSHADOW),0,0);
+ else if((pWindowInfo->pChildInfo[i].style&0x0000000F)==SS_WHITEFRAME)
+ DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(255,255,255),0,0);
+ else if((pWindowInfo->pChildInfo[i].style&0x0000001F)==SS_ETCHEDFRAME){
+ rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ DrawEdge(hdc,&rect,EDGE_ETCHED,BF_RECT);
+ }
+ else if((pWindowInfo->pChildInfo[i].style&0x0000000F)==SS_BLACKRECT)
+ DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,GetSysColor(COLOR_3DDKSHADOW),GetSysColor(COLOR_3DDKSHADOW),1);
+ else if((pWindowInfo->pChildInfo[i].style&0x0000000F)==SS_GRAYRECT)
+ DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DSHADOW),1);
+ else if((pWindowInfo->pChildInfo[i].style&0x0000000F)==SS_WHITERECT)
+ DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(255,255,255),RGB(255,255,255),1);
+ else if((pWindowInfo->pChildInfo[i].style&0x0000000F)==SS_ICON){
+ if(pWindowInfo->pChildInfo[i].ImageCtrlInfo.type==IMGTYPE_FILE)
+ lstrcpy(temporary,pWindowInfo->pChildInfo[i].ImageCtrlInfo.path);
+ else{
+ for(i2=0;i2pChildInfo[i].ImageCtrlInfo.path,
+ ProjectInfo.res.pIconResInfo[i2].IdName)==0) break;
+ }
+ if(i2==ProjectInfo.res.NumberOfIconRes) goto NonIconImage;
+
+ lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i2].path);
+ }
+ GetFullPath(temporary,ProjectInfo.dir);
+ hImage=LoadImage(NULL,temporary,IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
+ if(hImage){
+ pWindowInfo->pChildInfo[i].size.cx=32+(pWindowInfo->pChildInfo[i].size.cx-size.cx);
+ pWindowInfo->pChildInfo[i].size.cy=32+(pWindowInfo->pChildInfo[i].size.cy-size.cy);
+ pos=pWindowInfo->pChildInfo[i].pos;
+ size=pWindowInfo->pChildInfo[i].size;
+
+ //ExStyleによる縁を再描画
+ DrawItemEdgeByExStyle(WndNum,pWindowInfo->pChildInfo[i].ExStyle,&pos,&size);
+
+ DrawIcon(hdc,
+ pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
+ pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
+ (HICON)hImage);
+ DestroyIcon((HICON)hImage);
+ }
+ else{
+NonIconImage:
+ DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(0,0,0),0,0);
+ hOldFont=(HFONT)SelectObject(hdc,hFont);
+ rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
+ DrawText(hdc,"icon...",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
+ SelectObject(hdc,hOldFont);
+ }
+ }
+ else if((pWindowInfo->pChildInfo[i].style&0x0000000F)==SS_BITMAP){
+ BITMAP Bitmap;
+
+ if(pWindowInfo->pChildInfo[i].ImageCtrlInfo.type==IMGTYPE_FILE)
+ lstrcpy(temporary,pWindowInfo->pChildInfo[i].ImageCtrlInfo.path);
+ else{
+ for(i2=0;i2pChildInfo[i].ImageCtrlInfo.path,
+ ProjectInfo.res.pBitmapResInfo[i2].IdName)==0) break;
+ }
+ if(i2==ProjectInfo.res.NumberOfBitmapRes) goto NonBitmapImage;
+
+ lstrcpy(temporary,ProjectInfo.res.pBitmapResInfo[i2].path);
+ }
+ GetFullPath(temporary,ProjectInfo.dir);
+ hImage=LoadImage(NULL,temporary,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
+ if(hImage){
+ GetObject(hImage,sizeof(BITMAP),&Bitmap);
+
+ pWindowInfo->pChildInfo[i].size.cx=Bitmap.bmWidth+(pWindowInfo->pChildInfo[i].size.cx-size.cx);
+ pWindowInfo->pChildInfo[i].size.cy=Bitmap.bmHeight+(pWindowInfo->pChildInfo[i].size.cy-size.cy);
+ pos=pWindowInfo->pChildInfo[i].pos;
+ size=pWindowInfo->pChildInfo[i].size;
+
+ //ExStyleによる縁を再描画
+ DrawItemEdgeByExStyle(WndNum,pWindowInfo->pChildInfo[i].ExStyle,&pos,&size);
+
+ memdc=CreateCompatibleDC(hdc);
+ SelectObject(memdc,hImage);
+ BitBlt(hdc,
+ pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
+ pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
+ size.cx, size.cy,
+ memdc, 0,0,
+ SRCCOPY);
+ DeleteDC(memdc);
+ DeleteObject(hImage);
+ }
+ else{
+NonBitmapImage:
+ DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(0,0,0),0,0);
+ hOldFont=(HFONT)SelectObject(hdc,hFont);
+ rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
+ DrawText(hdc,"bmp...",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
+ SelectObject(hdc,hOldFont);
+ }
+ }
+ }
+
+ else if(pWindowInfo->pChildInfo[i].Control==CT_LISTBOX){
+ /////////////////////////
+ // ListBox コントロール
+
+ //内部
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED)
+ rgb=GetSysColor(COLOR_3DFACE);
+ else rgb=GetSysColor(COLOR_WINDOW);
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ rgb,rgb,1);
+
+ if(pWindowInfo->pChildInfo[i].style&LBS_DISABLENOSCROLL)
+ DrawWindowScrollBar(WndNum,pWindowInfo->pChildInfo[i].style|WS_DISABLED,&pos,&size);
+ }
+
+ else if(pWindowInfo->pChildInfo[i].Control==CT_LISTVIEW){
+ //////////////////////////
+ // ListView コントロール
+
+ //内部
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED)
+ rgb=GetSysColor(COLOR_3DFACE);
+ else rgb=GetSysColor(COLOR_WINDOW);
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ rgb,rgb,1);
+
+ if((pWindowInfo->pChildInfo[i].style&LVS_REPORT)&&
+ (!((pWindowInfo->pChildInfo[i].style&LVS_LIST)==LVS_LIST))){
+ //レポート ビュー
+ size.cy=16;
+ DrawButtonEdge(WndNum,&pos,&size);
+ }
+ }
+
+ else if(pWindowInfo->pChildInfo[i].Control==CT_PROGRESSBAR){
+ /////////////////////////////
+ // ProgressBar コントロール
+
+ //内部
+ pos.x++;
+ pos.y++;
+ size.cx-=2;
+ size.cy-=2;
+ rgb=GetSysColor(COLOR_ACTIVECAPTION);
+ if(pWindowInfo->pChildInfo[i].style&PBS_SMOOTH){
+ if(pWindowInfo->pChildInfo[i].style&PBS_VERTICAL){
+ pos.y+=(long)((double)size.cy*0.3);
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+(long)((double)size.cy*0.7),
+ rgb,rgb,1);
+ }
+ else{
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+(long)((double)size.cx*0.7),pos.y+size.cy,
+ rgb,rgb,1);
+ }
+ }
+ else{
+ if(pWindowInfo->pChildInfo[i].style&PBS_VERTICAL){
+ pos.y+=(long)((double)size.cy*0.3);
+ i3=(size.cx*2)/3;
+ i2=(int)((double)size.cy*0.7);
+ for(;i2>i3;i2-=i3+2){
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y+i2-i3,
+ pos.x+size.cx,pos.y+i2,
+ rgb,rgb,1);
+ }
+ }
+ else{
+ i3=(size.cy*2)/3;
+ i4=(int)((double)size.cx*0.7);
+ for(i2=0;i2+i3pChildInfo[i].Control==CT_RADIOBUTTON){
+ /////////////////////////////
+ // RadioButton コントロール
+
+ if(pWindowInfo->pChildInfo[i].style&BS_PUSHLIKE){
+ //ボタンの縁を描画
+ DrawButtonEdge(WndNum,&pos,&size);
+ }
+ else{
+ //ラジオボタンを描画
+ size2.cx=12;
+ size2.cy=12;
+ if(pWindowInfo->pChildInfo[i].style&BS_LEFTTEXT)
+ pos2.x=pos.x+size.cx-size2.cx;
+ else pos2.x=pos.x+1;
+ if((pWindowInfo->pChildInfo[i].style&BS_VCENTER)==BS_VCENTER||
+ (pWindowInfo->pChildInfo[i].style&BS_VCENTER)==0)
+ pos2.y=pos.y+(size.cy/2)-(size2.cy/2);
+ else if(pWindowInfo->pChildInfo[i].style&BS_TOP)
+ pos2.y=pos.y+1;
+ else if(pWindowInfo->pChildInfo[i].style&BS_BOTTOM)
+ pos2.y=pos.y+size.cy-size2.cy-1;
+
+ hResource=LoadResource(hResInst,FindResource(hResInst,MAKEINTRESOURCE(IDB_RADIOBUTTON),RT_BITMAP));
+ pBitmapInfo=(BITMAPINFO *)LockResource(hResource);
+ pByte=(BYTE *)pBitmapInfo+pBitmapInfo->bmiHeader.biSize;
+ pByte2=(BYTE *)GlobalAlloc(GMEM_FIXED,pBitmapInfo->bmiHeader.biWidth*pBitmapInfo->bmiHeader.biHeight*3);
+ for(i2=0,i3=0;i2bmiHeader.biWidth*pBitmapInfo->bmiHeader.biHeight;i2++,i3+=3){
+ rgb=RGB(pByte[i3+2],pByte[i3+1],pByte[i3]);
+
+ if(rgb==RGB(255,255,0)){
+ if(pWindowInfo->bgColor==COLOR_3DFACE) rgb=GetSysColor(COLOR_3DFACE);
+ else rgb=-pWindowInfo->bgColor;
+ }
+
+ //影側
+ else if(rgb==RGB(0,0,0)) rgb=GetSysColor(COLOR_3DSHADOW);
+ else if(rgb==RGB(255,0,0)) rgb=GetSysColor(COLOR_3DDKSHADOW);
+
+ //光源側
+ else if(rgb==RGB(0,0,255)) rgb=GetSysColor(COLOR_3DLIGHT);
+ else if(rgb==RGB(0,255,0)) rgb=GetSysColor(COLOR_3DHIGHLIGHT);
+
+ //内部
+ else if(rgb==RGB(255,255,255)){
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED) rgb=GetSysColor(COLOR_3DFACE);
+ }
+
+ pByte2[i3+2]=LOBYTE(LOWORD(rgb));
+ pByte2[i3+1]=HIBYTE(LOWORD(rgb));
+ pByte2[i3]=LOBYTE(HIWORD(rgb));
+ }
+ SetDIBitsToDevice(hdc,
+ pos2.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
+ pos2.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
+ pBitmapInfo->bmiHeader.biWidth, pBitmapInfo->bmiHeader.biHeight,
+ 0,0,
+ 0,pBitmapInfo->bmiHeader.biHeight,
+ pByte2,
+ pBitmapInfo,
+ DIB_RGB_COLORS);
+ GlobalFree(pByte2);
+
+ if(!(pWindowInfo->pChildInfo[i].style&BS_LEFTTEXT)) pos.x+=17;
+ else pos.x++;
+ size.cx-=17;
+ }
+
+ if(!(pWindowInfo->pChildInfo[i].style&(BS_ICON|BS_BITMAP))){
+ //キャプション テキスト
+ rect.left=pos.x+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.top=pos.y+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ rect.right=pos.x+size.cx-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.bottom=pos.y+size.cy-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+
+ if(pWindowInfo->pChildInfo[i].style&BS_MULTILINE) i4=0;
+ else i4=DT_SINGLELINE;
+
+ //ビットを考慮してBS_CENTERを最初に比較する
+ if((pWindowInfo->pChildInfo[i].style&BS_CENTER)==BS_CENTER) i2=DT_CENTER;
+ else if(pWindowInfo->pChildInfo[i].style&BS_LEFT) i2=DT_LEFT;
+ else if(pWindowInfo->pChildInfo[i].style&BS_RIGHT) i2=DT_RIGHT;
+ else i2=DT_LEFT;
+
+ //ビットを考慮してBS_VCENTERを最初に比較する
+ if((pWindowInfo->pChildInfo[i].style&BS_VCENTER)==BS_VCENTER) i3=DT_VCENTER;
+ else if(pWindowInfo->pChildInfo[i].style&BS_TOP) i3=DT_TOP;
+ else if(pWindowInfo->pChildInfo[i].style&BS_BOTTOM) i3=DT_BOTTOM;
+ else i3=DT_VCENTER;
+
+ hOldFont=(HFONT)SelectObject(hdc,hFont);
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED){
+ SetTextColor(hdc,RGB(255,255,255));
+ rc2.left=rect.left+1;
+ rc2.top=rect.top+1;
+ rc2.right=rect.right+1;
+ rc2.bottom=rect.bottom+1;
+ DrawText(hdc,pWindowInfo->pChildInfo[i].caption,-1,&rc2,i4|i2|i3);
+ SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
+ }
+ else SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
+
+ DrawText(hdc,pWindowInfo->pChildInfo[i].caption,-1,&rect,i4|i2|i3);
+ SelectObject(hdc,hOldFont);
+ }
+ }
+
+ else if(pWindowInfo->pChildInfo[i].Control==CT_STATIC){
+ ////////////////////////
+ // Static コントロール
+
+ //キャプション テキスト
+ rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+ rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
+ rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
+
+ //ビットを考慮してSS_LEFTを最後に検討する
+ if(pWindowInfo->pChildInfo[i].style&SS_CENTER) i2=DT_CENTER;
+ else if(pWindowInfo->pChildInfo[i].style&SS_RIGHT) i2=DT_RIGHT;
+ else i2=DT_LEFT;
+
+ hOldFont=(HFONT)SelectObject(hdc,hFont);
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED){
+ SetTextColor(hdc,RGB(255,255,255));
+ rc2.left=rect.left+1;
+ rc2.top=rect.top+1;
+ rc2.right=rect.right+1;
+ rc2.bottom=rect.bottom+1;
+ DrawText(hdc,pWindowInfo->pChildInfo[i].caption,-1,&rc2,i2);
+ SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
+ }
+ else
+ SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
+
+ //折り返すかどうか
+ if(!(pWindowInfo->pChildInfo[i].style&SS_LEFTNOWORDWRAP)){
+ i2|=DT_WORDBREAK;
+ }
+
+ DrawText(hdc,pWindowInfo->pChildInfo[i].caption,-1,&rect,i2);
+ SelectObject(hdc,hOldFont);
+ }
+
+ else if(pWindowInfo->pChildInfo[i].Control==CT_TRACKBAR){
+ //////////////////////////
+ // TrackBar コントロール
+
+ if(pWindowInfo->pChildInfo[i].style&TBS_VERT){
+ pos.x+=2;
+ size.cx-=2;
+ if(size.cx>21) size.cx=21;
+ pos.y+=8;
+ size.cy-=16;
+
+ rect.left=MdiInfo[WndNum].MdiRadInfo->ClientPos.x+pos.x+(size.cx/2)-2;
+ rect.right=MdiInfo[WndNum].MdiRadInfo->ClientPos.x+pos.x+(size.cx/2)+2;
+ rect.top=MdiInfo[WndNum].MdiRadInfo->ClientPos.y+pos.y;
+ rect.bottom=MdiInfo[WndNum].MdiRadInfo->ClientPos.y+pos.y+size.cy;
+ DrawEdge(hdc,&rect,EDGE_SUNKEN,BF_RECT);
+
+ size.cy=size.cx/2;
+ DrawButtonEdge(WndNum,&pos,&size);
+ }
+ else{
+ pos.x+=8;
+ size.cx-=16;
+ pos.y+=2;
+ size.cy-=2;
+ if(size.cy>21) size.cy=21;
+
+ rect.left=MdiInfo[WndNum].MdiRadInfo->ClientPos.x+pos.x;
+ rect.right=MdiInfo[WndNum].MdiRadInfo->ClientPos.x+pos.x+size.cx;
+ rect.top=MdiInfo[WndNum].MdiRadInfo->ClientPos.y+pos.y+(size.cy/2)-2;
+ rect.bottom=MdiInfo[WndNum].MdiRadInfo->ClientPos.y+pos.y+(size.cy/2)+2;
+ DrawEdge(hdc,&rect,EDGE_SUNKEN,BF_RECT);
+
+ size.cx=size.cy/2;
+ DrawButtonEdge(WndNum,&pos,&size);
+ }
+ }
+
+ else if(pWindowInfo->pChildInfo[i].Control==CT_TREEVIEW){
+ //////////////////////////
+ // TreeView コントロール
+
+ //内部
+ if(pWindowInfo->pChildInfo[i].style&WS_DISABLED)
+ rgb=GetSysColor(COLOR_3DFACE);
+ else rgb=GetSysColor(COLOR_WINDOW);
+ DrawRectangleInClient(WndNum,
+ pos.x,pos.y,
+ pos.x+size.cx,pos.y+size.cy,
+ rgb,rgb,1);
+ }
+
+ else if(pWindowInfo->pChildInfo[i].Control==CT_UPDOWN){
+ ///////////////////////////////
+ // アップ ダウン コントロール
+ if(pWindowInfo->pChildInfo[i].style&UDS_HORZ)
+ DrawUpDownControl(WndNum,pWindowInfo->pChildInfo[i].style,0,&pos,&size);
+ else DrawUpDownControl(WndNum,pWindowInfo->pChildInfo[i].style,1,&pos,&size);
+ }
+
+ else if(pWindowInfo->pChildInfo[i].Control==CT_VSCROLLBAR){
+ ////////////////////////////////////
+ // 垂直スクロールバー コントロール
+ DrawScrollBar(WndNum,pWindowInfo->pChildInfo[i].style,1,&pos,&size);
+ }
+ }
+ DeleteObject(hFont);
+}
+void DrawRadWindow(int WndNum,WINDOW_INFO *pWindowInfo){
+ extern MDIINFO MdiInfo[MAX_WNDNUM];
+ HBRUSH hOldBrush;
+ POINT pos;
+
+ SetBkMode(MdiInfo[WndNum].MdiRadInfo->hMemDC,TRANSPARENT);
+
+ hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,GetStockObject(WHITE_BRUSH));
+ PatBlt(MdiInfo[WndNum].MdiRadInfo->hMemDC,0,0,ScreenX*2,ScreenY*2,PATCOPY);
+ SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldBrush);
+
+ pos.x=LEVER_THICK;
+ pos.y=LEVER_THICK;
+ DesigningWindow(WndNum,MdiInfo[WndNum].MdiRadInfo->hMemDC,&pos,pWindowInfo);
+
+ InvalidateRect(MdiInfo[WndNum].MdiRadInfo->hRad,NULL,0);
+}
Index: /ProjectEditor/EndPairCommandComplement.cpp
===================================================================
--- /ProjectEditor/EndPairCommandComplement.cpp (revision 3)
+++ /ProjectEditor/EndPairCommandComplement.cpp (revision 3)
@@ -0,0 +1,452 @@
+#include "common.h"
+
+///////////////////////////////////////////////////////////////////
+// ここから、ペアステートメント補完を行うための関数郡
+///////////////////////////////////////////////////////////////////
+
+int GetStartCommandId_FromBuffer(char *buffer){
+ int i;
+ char temporary[VN_SIZE];
+
+ for(i=0;;i++){
+ if(!IsVariableChar(buffer[i])){
+ temporary[i]=0;
+ break;
+ }
+ temporary[i]=buffer[i];
+ }
+
+ if(lstrcmpi(temporary,"If")==0){
+ //If文の場合はブロック形式の有無を判定
+
+ int IsStr=0;
+ for(;;i++){
+ if(buffer[i]=='\"') IsStr^=1;
+ if((buffer[i]=='\''||IsCommandDelimitation(buffer,i))&&IsStr==0){
+ i--;
+ break;
+ }
+ }
+
+ while(buffer[i]==' '||buffer[i]=='\t') i--;
+
+ if(memicmp(buffer+i-3,"Then",4)==0){
+ //ブロック形式のIf
+ return COM_IF;
+ }
+ else{
+ //一行のみのIf
+ return 0;
+ }
+ }
+
+ if(lstrcmpi(temporary,"Virtual")==0||
+ lstrcmpi(temporary,"Override")==0||
+ lstrcmpi(temporary,"Static")==0){
+ if(temporary[0]=='s'||temporary[0]=='S')
+ i=7;
+ else if(temporary[0]=='v'||temporary[0]=='V')
+ i=8;
+ else i=9;
+
+ while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+ int i2;
+ for(i2=0;;i++,i2++){
+ if(!IsVariableChar(buffer[i])){
+ temporary[i2]=0;
+ break;
+ }
+ temporary[i2]=buffer[i];
+ }
+
+ if(lstrcmpi(temporary,"Function")==0) return COM_FUNCTION;
+ if(lstrcmpi(temporary,"Sub")==0) return COM_SUB;
+ return 0;
+ }
+
+ if(lstrcmpi(temporary,"Class")==0) return COM_CLASS;
+ if(lstrcmpi(temporary,"Interface")==0) return COM_INTERFACE;
+ if(lstrcmpi(temporary,"Do")==0) return COM_DO;
+ if(lstrcmpi(temporary,"Enum")==0) return COM_ENUM;
+ if(lstrcmpi(temporary,"For")==0) return COM_FOR;
+ if(lstrcmpi(temporary,"Function")==0) return COM_FUNCTION;
+ if(lstrcmpi(temporary,"Select")==0) return COM_SELECT;
+ if(lstrcmpi(temporary,"Sub")==0) return COM_SUB;
+ if(lstrcmpi(temporary,"Type")==0) return COM_TYPE;
+ if(lstrcmpi(temporary,"While")==0) return COM_WHILE;
+ if(lstrcmpi(temporary,"With")==0) return COM_WITH;
+
+ return 0;
+}
+int GetEndCommandId_FromBuffer(char *buffer){
+ int i,i2;
+ char temporary[VN_SIZE];
+
+ for(i=0,i2=0;;i++,i2++){
+ if(!IsVariableChar(buffer[i])){
+ temporary[i2]=0;
+
+ if(lstrcmpi(temporary,"End")==0&&
+ (buffer[i]==' '||buffer[i]=='\t')){
+ while(buffer[i]==' '||buffer[i]=='\t') i++;
+ i--;
+ i2--;
+ continue;
+ }
+
+ break;
+ }
+ temporary[i2]=buffer[i];
+ }
+
+ if(lstrcmpi(temporary,"EndClass")==0) return COM_CLASS;
+ if(lstrcmpi(temporary,"EndInterface")==0) return COM_INTERFACE;
+ if(lstrcmpi(temporary,"Loop")==0) return COM_DO;
+ if(lstrcmpi(temporary,"EndEnum")==0) return COM_ENUM;
+ if(lstrcmpi(temporary,"Next")==0) return COM_FOR;
+ if(lstrcmpi(temporary,"EndFunction")==0) return COM_FUNCTION;
+ if(lstrcmpi(temporary,"EndIf")==0) return COM_IF;
+ if(lstrcmpi(temporary,"EndSelect")==0) return COM_SELECT;
+ if(lstrcmpi(temporary,"EndSub")==0) return COM_SUB;
+ if(lstrcmpi(temporary,"EndType")==0) return COM_TYPE;
+ if(lstrcmpi(temporary,"Wend")==0) return COM_WHILE;
+ if(lstrcmpi(temporary,"EndWith")==0) return COM_WITH;
+
+ return 0;
+}
+void GetNameOfEndCommand(int CmdId,char *buffer){
+ switch(CmdId){
+ case COM_CLASS:
+ lstrcpy(buffer,"End Class");
+ break;
+ case COM_INTERFACE:
+ lstrcpy(buffer,"End Interface");
+ break;
+ case COM_DO:
+ lstrcpy(buffer,"Loop");
+ break;
+ case COM_ENUM:
+ lstrcpy(buffer,"End Enum");
+ break;
+ case COM_FOR:
+ lstrcpy(buffer,"Next");
+ break;
+ case COM_FUNCTION:
+ lstrcpy(buffer,"End Function");
+ break;
+ case COM_IF:
+ lstrcpy(buffer,"End If");
+ break;
+ case COM_SELECT:
+ lstrcpy(buffer,"End Select");
+ break;
+ case COM_SUB:
+ lstrcpy(buffer,"End Sub");
+ break;
+ case COM_TYPE:
+ lstrcpy(buffer,"End Type");
+ break;
+ case COM_WHILE:
+ lstrcpy(buffer,"Wend");
+ break;
+ case COM_WITH:
+ lstrcpy(buffer,"End With");
+ break;
+ }
+}
+BOOL IsIntoStringQuotes(char *buffer,int i){
+ int i2;
+
+ i2=i;
+ while(i2&&buffer[i2]!='\n') i2--;
+ if(i2==-1) i2=0;
+ if(buffer[i2]=='\n') i2++;
+
+ int IsStr=0;
+ for(;i2=0;i--){
+ i2=IsCommandDelimitation(buffer,i);
+ if(i2) break;
+ }
+
+ while(1){
+
+ //i2に一行前の先頭位置を格納
+ for(i--;i>=0;i--){
+ i2=IsCommandDelimitation(buffer,i);
+ if(i2){
+ if(IsIntoStringQuotes(buffer,i)){
+ //文字列中の場合
+ continue;
+ }
+
+ if(i2==1) i2=i+1;
+ else{
+ i2=i+2;
+ LineNum++;
+
+ if(LineNum>pobj_nv->BackNum_PairStatementComplement){
+ //設定された行数を超えた場合
+ return 0;
+ }
+ }
+
+ break;
+ }
+ }
+ if(i==-1) i2=i+1;
+
+ //インデント文字列をindentにコピー
+ for(i3=0;;i2++,i3++){
+ if(buffer[i2]!='\t'){
+ indent[i3]=0;
+ break;
+ }
+ indent[i3]=buffer[i2];
+ }
+
+ //空白文字を飛び越す
+ while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+ //終了コマンドを取得(End Class、End Sub、Next、Wendなど…)
+ i3=GetEndCommandId_FromBuffer(buffer+i2);
+ if(i3){
+ sp++;
+ stack[sp]=i3;
+ }
+
+ //開始コマンドを取得(Class、Sub、For、Whileなど…)
+ i3=GetStartCommandId_FromBuffer(buffer+i2);
+ if(i3){
+ if(sp==-1){
+ CmdId=i3;
+ break;
+ }
+
+ if(stack[sp]!=i3) return 0;
+ sp--;
+ }
+
+ if(i<=0) break;
+ }
+
+ if(!CmdId) return 0;
+
+ extern HANDLE hHeap;
+ extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+ if(CmdId==COM_IF){
+ //Else、ElseIf、End Ifをリストに追加
+
+ ///////////////////////
+ // 補完情報
+ ///////////////////////
+
+ ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*2);
+ ComplementWndInfo.MemberNum=2;
+
+ ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,5);
+ lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"Else");
+ ComplementWndInfo.pMemberInfo[0].dwProc=0;
+ ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
+
+ ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,7);
+ lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"End If");
+ ComplementWndInfo.pMemberInfo[1].dwProc=0;
+ ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
+ }
+ else if(CmdId==COM_CLASS){
+ ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*4);
+ ComplementWndInfo.MemberNum=4;
+
+ ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,10);
+ lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"End Class");
+ ComplementWndInfo.pMemberInfo[0].dwProc=0;
+ ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
+
+ ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,8);
+ lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"Private");
+ ComplementWndInfo.pMemberInfo[1].dwProc=0;
+ ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
+
+ ComplementWndInfo.pMemberInfo[2].pName=(char *)HeapAlloc(hHeap,0,10);
+ lstrcpy(ComplementWndInfo.pMemberInfo[2].pName,"Protected");
+ ComplementWndInfo.pMemberInfo[2].dwProc=0;
+ ComplementWndInfo.pMemberInfo[2].dwAccess=ACCESS_PAIRCOMMAND;
+
+ ComplementWndInfo.pMemberInfo[3].pName=(char *)HeapAlloc(hHeap,0,7);
+ lstrcpy(ComplementWndInfo.pMemberInfo[3].pName,"Public");
+ ComplementWndInfo.pMemberInfo[3].dwProc=0;
+ ComplementWndInfo.pMemberInfo[3].dwAccess=ACCESS_PAIRCOMMAND;
+ }
+ else if(CmdId==COM_SELECT){
+ ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*4);
+ ComplementWndInfo.MemberNum=2;
+
+ ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,10);
+ lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"End Select");
+ ComplementWndInfo.pMemberInfo[0].dwProc=0;
+ ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
+
+ ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,8);
+ lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"Case");
+ ComplementWndInfo.pMemberInfo[1].dwProc=0;
+ ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
+ }
+ else{
+ //その他のコマンド
+
+ //エンドペアステートメントの名前を取得
+ GetNameOfEndCommand(CmdId,epcName);
+
+
+ ///////////////////////
+ // 補完情報
+ ///////////////////////
+
+ ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO));
+ ComplementWndInfo.MemberNum=1;
+
+ ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,lstrlen(epcName)+1);
+ lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,epcName);
+
+ ComplementWndInfo.pMemberInfo[0].dwProc=0;
+ ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
+ }
+ lstrcpy(ComplementWndInfo.szIndent,indent);
+
+
+ return 1;
+}
+BOOL IsNeedNewIndentCommand(char *name){
+ if(lstrcmpi(name,"Case")==0) return 1;
+ return 0;
+}
+
+
+
+///////////////////////////////////////////////
+// Withで構成されるオブジェクト識別子を取得
+///////////////////////////////////////////////
+
+void GetWithObjectVariable(char *buffer,int p,char *pObjectVar){
+ int i,i2,i3,i4,CmdId;
+ char LineNum;
+ char temporary[VN_SIZE];
+
+ int stack[255];
+ int sp;
+
+ CmdId=0;
+ LineNum=0;
+ sp=-1;
+ pObjectVar[0]=0;
+
+ i=p;
+
+ //入力中の行を除く
+ for(i--;i>=0;i--){
+ i2=IsCommandDelimitation(buffer,i);
+ if(i2) break;
+ }
+
+ while(1){
+
+ //i2に一行前の先頭位置を格納
+ for(i--;i>=0;i--){
+ i2=IsCommandDelimitation(buffer,i);
+ if(i2){
+ if(i2==1) i2=i+1;
+ else{
+ i2=i+2;
+ LineNum++;
+
+ if(LineNum>pobj_nv->BackNum_PairStatementComplement){
+ //設定された行数を超えた場合
+ return;
+ }
+ }
+
+ break;
+ }
+ }
+ if(i==-1) i2=i+1;
+
+ //インデントを飛び越す
+ while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+ //終了コマンドを取得(End Class、End Sub、Next、Wendなど…)
+ CmdId=GetEndCommandId_FromBuffer(buffer+i2);
+ if(CmdId){
+ sp++;
+ stack[sp]=CmdId;
+ }
+
+ //開始コマンドを取得(Class、Sub、For、Whileなど…)
+ CmdId=GetStartCommandId_FromBuffer(buffer+i2);
+ if(CmdId){
+ if(sp==-1){
+ if(CmdId==COM_WITH){
+ //オブジェクト識別子を付加
+ i2+=5;
+ while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+ for(i3=0;;i2++,i3++){
+ if(buffer[i2]=='-'&&buffer[i2+1]=='>'){
+ temporary[i3++]=buffer[i2++];
+ temporary[i3]=buffer[i2];
+ continue;
+ }
+ if(buffer[i2]=='['){
+ i4=GetStringInBracket(temporary+i3,buffer+i2);
+ i2+=i4-1;
+ i3+=i4-1;
+ continue;
+ }
+ if(buffer[i2]=='('){
+ i4=GetStringInPare(temporary+i3,buffer+i2);
+ i2+=i4-1;
+ i3+=i4-1;
+ continue;
+ }
+ if(!(IsVariableChar(buffer[i2])||buffer[i2]=='.')){
+ temporary[i3]=0;
+ break;
+ }
+ temporary[i3]=buffer[i2];
+ }
+ lstrcat(temporary,pObjectVar);
+ lstrcpy(pObjectVar,temporary);
+ }
+ }
+ else{
+ if(stack[sp]!=CmdId){
+ pObjectVar[0]=0;
+ break;
+ }
+ sp--;
+ }
+ }
+
+ if(i<=0) break;
+ }
+}
Index: /ProjectEditor/ExtensionLink.cpp
===================================================================
--- /ProjectEditor/ExtensionLink.cpp (revision 3)
+++ /ProjectEditor/ExtensionLink.cpp (revision 3)
@@ -0,0 +1,615 @@
+#include "common.h"
+
+
+#ifndef ListView_SetCheckState
+ #define ListView_SetCheckState(hwndLV, i, fCheck) \
+ ListView_SetItemState(hwndLV, i, \
+ INDEXTOSTATEIMAGEMASK((fCheck)+1), LVIS_STATEIMAGEMASK)
+#endif
+
+
+
+COneExt::COneExt(BOOL bReg,char *lpszExtension,char *lpszNote,BOOL bWindowsSearch,COLORREF tab_color){
+ m_bReg=bReg;
+ lstrcpy(m_szExtension,lpszExtension);
+ lstrcpy(m_szNote,lpszNote);
+ m_bWindowsSearch=bWindowsSearch;
+ TabColor=tab_color;
+}
+COneExt::~COneExt(){
+}
+
+CExtLink::CExtLink(){
+ ppobj_ExtItems=(COneExt **)malloc(1);
+ iExtItemNum=0;
+}
+CExtLink::~CExtLink(){
+ int i;
+ for(i=0;im_bReg,
+ ppobj_ExtItems[i]->m_szExtension,
+ ppobj_ExtItems[i]->m_szNote,
+ ppobj_ExtItems[i]->m_bWindowsSearch,
+ ppobj_ExtItems[i]->TabColor);
+ }
+
+ //保存
+ WriteBuffer(path,buffer,lstrlen(buffer));
+}
+
+BOOL CExtLink::add(BOOL bReg,char *lpszExtension,char *lpszNote,BOOL bWindowsSearch,COLORREF tab_color){
+ //重複チェック
+ int i;
+ for(i=0;im_szExtension,lpszExtension)==0){
+ return 0;
+ }
+ }
+
+ ppobj_ExtItems=(COneExt **)realloc(ppobj_ExtItems,(iExtItemNum+1)*sizeof(COneExt*));
+ ppobj_ExtItems[iExtItemNum]=new COneExt(bReg,lpszExtension,lpszNote,bWindowsSearch,tab_color);
+ iExtItemNum++;
+
+ return 1;
+}
+void CExtLink::del(char *lpszExtension){
+ int i;
+ for(i=0;im_szExtension)==0)
+ break;
+ }
+ if(i==iExtItemNum) return;
+
+ delete ppobj_ExtItems[i];
+
+ iExtItemNum--;
+ for(;ipobj_ExtLink->iExtItemNum; i++){
+ LV_ITEM item;
+
+ //拡張子
+ item.mask=LVIF_TEXT;
+ item.pszText=ppobj_ExtItems[i]->m_szExtension;
+ item.iItem=i;
+ item.iSubItem=0;
+ ListView_InsertItem(hListView,&item);
+
+ //説明
+ item.pszText=ppobj_ExtItems[i]->m_szNote;
+ item.iItem=i;
+ item.iSubItem++;
+ ListView_SetItem(hListView,&item);
+
+ //Windows検索
+ if(ppobj_ExtItems[i]->m_bWindowsSearch)
+ item.pszText="有効";
+ else item.pszText="無効";
+ item.iItem=i;
+ item.iSubItem++;
+ ListView_SetItem(hListView,&item);
+
+ if(bProfessional){
+ //タブの色
+ //※有料版のみ
+ if(ppobj_ExtItems[i]->TabColor==TABCOLOR_GRAY) item.pszText="灰色";
+ else if(ppobj_ExtItems[i]->TabColor==TABCOLOR_WHITE) item.pszText="白";
+ else if(ppobj_ExtItems[i]->TabColor==TABCOLOR_RED) item.pszText="赤";
+ else if(ppobj_ExtItems[i]->TabColor==TABCOLOR_GREEN) item.pszText="緑";
+ else if(ppobj_ExtItems[i]->TabColor==TABCOLOR_BLUE) item.pszText="青";
+ else if(ppobj_ExtItems[i]->TabColor==TABCOLOR_YELLOW) item.pszText="黄色";
+ else item.pszText="ユーザー設定";
+ item.iItem=i;
+ item.iSubItem++;
+ ListView_SetItem(hListView,&item);
+ }
+
+ //チェックマーク
+ ListView_SetCheckState(hListView,i,ppobj_ExtItems[i]->m_bReg);
+ }
+}
+
+COLORREF CExtLink::GetTabColorFromFilePath(char *path){
+ if(bProfessional){
+ //拡張子を識別し、タブの色を決定
+ //※有料版のみ
+ char szExt[255],*lpszTemp;
+ _splitpath(path,NULL,NULL,NULL,szExt);
+ if(szExt[0]=='.') lpszTemp=szExt+1;
+ else lpszTemp=szExt;
+ for(int i=0;im_szExtension)==0){
+ return ppobj_ExtItems[i]->TabColor;
+ }
+ }
+ }
+ return TABCOLOR_GRAY;
+}
+
+
+BOOL CALLBACK DlgFileLinkAdd(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ static COneExt *pobj_OneExt;
+
+ static int TabColor;
+ switch(message){
+ case WM_INITDIALOG:
+ if(lParam){
+ pobj_OneExt=(COneExt *)lParam;
+
+ SetDlgItemText(hwnd,IDC_EXTENSION,pobj_OneExt->m_szExtension);
+ SetDlgItemText(hwnd,IDC_NOTE,pobj_OneExt->m_szNote);
+ TabColor=pobj_OneExt->TabColor;
+
+ if(pobj_OneExt->m_bWindowsSearch)
+ SendDlgItemMessage(hwnd,IDC_SEARCH_ON,BM_SETCHECK,BST_CHECKED,0);
+ else
+ SendDlgItemMessage(hwnd,IDC_SEARCH_OFF,BM_SETCHECK,BST_CHECKED,0);
+
+ EnableWindow(GetDlgItem(hwnd,IDC_EXTENSION),0);
+
+ SetFocus(GetDlgItem(hwnd,IDC_NOTE));
+ }
+ else{
+ pobj_OneExt=0;
+ TabColor=TABCOLOR_GRAY;
+
+ SendDlgItemMessage(hwnd,IDC_SEARCH_ON,BM_SETCHECK,BST_CHECKED,0);
+
+ SetFocus(GetDlgItem(hwnd,IDC_EXTENSION));
+ }
+
+ if(!bProfessional){
+ //フリー版の場合は、タブの色設定を排除する
+ ShowWindow(GetDlgItem(hwnd,IDC_STATIC_TABCOLOR),SW_HIDE);
+ ShowWindow(GetDlgItem(hwnd,IDC_STATIC_TABCOLOR2),SW_HIDE);
+ ShowWindow(GetDlgItem(hwnd,IDC_COLOR_BUTTON),SW_HIDE);
+ }
+
+ SendMessage(hwnd,WM_COMMAND,IDC_EXTENSION,0);
+
+ break;
+ case WM_DRAWITEM:
+ LPDRAWITEMSTRUCT pds;
+ pds=(LPDRAWITEMSTRUCT)lParam;
+
+ HBRUSH hBrush,hOldBrush;
+
+ if(wParam==IDC_COLOR_BUTTON){
+ //////////////
+ // 色を描画
+ //////////////
+
+ //ペンとブラシを生成
+ HPEN hPen,hOldPen;
+ hPen=(HPEN)GetStockObject(WHITE_PEN);
+ hBrush=CreateSolidBrush(TabColor);
+
+ //塗りつぶす
+ hOldPen=(HPEN)SelectObject(pds->hDC,hPen);
+ hOldBrush=(HBRUSH)SelectObject(pds->hDC,hBrush);
+ Rectangle(pds->hDC,0,0,pds->rcItem.right,pds->rcItem.bottom);
+ SelectObject(pds->hDC,hOldPen);
+ SelectObject(pds->hDC,hOldBrush);
+
+ //ブラシを破棄
+ DeleteObject(hBrush);
+ }
+ return 1;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDOK:
+ char szExtension[64];
+ GetDlgItemText(hwnd,IDC_EXTENSION,szExtension,64);
+
+ char szNote[255];
+ GetDlgItemText(hwnd,IDC_NOTE,szNote,255);
+
+ BOOL bWindowsSearch;
+ if(SendDlgItemMessage(hwnd,IDC_SEARCH_ON,BM_GETCHECK,0,0))
+ bWindowsSearch=1;
+ else bWindowsSearch=0;
+
+ if(pobj_OneExt){
+ //変更
+ lstrcpy(pobj_OneExt->m_szNote,szNote);
+ pobj_OneExt->m_bWindowsSearch=bWindowsSearch;
+ pobj_OneExt->TabColor=TabColor;
+ }
+ else{
+ //追加
+ if(!pobj_nv->pobj_ExtLink->add(1,szExtension,szNote,bWindowsSearch,TabColor)){
+ char temporary[255];
+ sprintf(temporary,"拡張子 %s は既にリストに存在します。",szExtension);
+ MessageBox(hwnd,temporary,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+
+ return 1;
+ }
+ }
+
+ EndDialog(hwnd,1);
+ return 1;
+ case IDCANCEL:
+ EndDialog(hwnd,0);
+ return 1;
+ case IDC_COLOR_BUTTON:
+ POINT pos;
+ GetCursorPos(&pos);
+ extern HMENU hTabColorMenu;
+ TrackPopupMenu(hTabColorMenu,TPM_LEFTALIGN,pos.x,pos.y,0,hwnd,0);
+ return 1;
+
+ case IDC_EXTENSION:
+ if(GetWindowTextLength(GetDlgItem(hwnd,IDC_EXTENSION)))
+ EnableWindow(GetDlgItem(hwnd,IDOK),1);
+ else
+ EnableWindow(GetDlgItem(hwnd,IDOK),0);
+ return 1;
+
+ case IDM_USER_COLOR:
+ COLORREF colorUser;
+ colorUser=TabColor;
+ {
+ CHOOSECOLOR cc;
+ COLORREF CusColors[16]={
+ RGB(255,255,255),
+ RGB(0,0,0),
+ RGB(128,128,128),
+ RGB(192,192,192),
+ RGB(128,0,0),
+ RGB(255,0,0),
+ RGB(128,128,0),
+ RGB(255,255,0),
+ RGB(0,128,0),
+ RGB(0,255,0),
+ RGB(0,128,128),
+ RGB(0,255,255),
+ RGB(0,0,128),
+ RGB(0,0,255),
+ RGB(128,0,128),
+ RGB(255,0,255)};
+ cc.lStructSize=sizeof(CHOOSECOLOR);
+ cc.hwndOwner=hwnd;
+ cc.rgbResult=colorUser;
+ cc.lpCustColors=CusColors;
+ cc.Flags=CC_RGBINIT|CC_FULLOPEN;
+ if(!ChooseColor(&cc)){
+ return 0;
+ }
+ colorUser=cc.rgbResult;
+ }
+ case IDM_GRAY:
+ case IDM_WHITE:
+ case IDM_RED:
+ case IDM_GREEN:
+ case IDM_BLUE:
+ case IDM_YELLOW:
+ if(LOWORD(wParam)==IDM_GRAY) TabColor=TABCOLOR_GRAY;
+ if(LOWORD(wParam)==IDM_WHITE) TabColor=TABCOLOR_WHITE;
+ if(LOWORD(wParam)==IDM_RED) TabColor=TABCOLOR_RED;
+ if(LOWORD(wParam)==IDM_GREEN) TabColor=TABCOLOR_GREEN;
+ if(LOWORD(wParam)==IDM_BLUE) TabColor=TABCOLOR_BLUE;
+ if(LOWORD(wParam)==IDM_YELLOW) TabColor=TABCOLOR_YELLOW;
+ if(LOWORD(wParam)==IDM_USER_COLOR) TabColor=colorUser;
+ InvalidateRect(GetDlgItem(hwnd,IDC_COLOR_BUTTON),NULL,0);
+ return 1;
+ }
+ break;
+ }
+ return 0;
+}
+
+BOOL CALLBACK DlgLinkFile(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+ int i;
+ HWND hListView;
+ char temporary[255];
+ switch(message){
+ case WM_INITDIALOG:
+ SetPosCenter(hwnd);
+
+
+
+ ///////////////////////////
+ // カラムの設定
+ ///////////////////////////
+
+ //拡張スタイル
+ DWORD dwStyle;
+ hListView=GetDlgItem(hwnd,IDC_EXTENSION_LIST);
+ dwStyle=ListView_GetExtendedListViewStyle(hListView);
+ dwStyle|=LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES;
+ ListView_SetExtendedListViewStyle(hListView,dwStyle);
+
+ LV_COLUMN ListView_Column;
+ ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+ ListView_Column.fmt=LVCFMT_LEFT;
+
+ ListView_Column.cx=50;
+ ListView_Column.pszText="拡張子";
+ ListView_Column.iSubItem=0;
+ ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+ ListView_Column.cx=150;
+ ListView_Column.pszText="説明";
+ ListView_Column.iSubItem++;
+ ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+ ListView_Column.cx=90;
+ ListView_Column.pszText="Windows検索";
+ ListView_Column.iSubItem++;
+ ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+ if(bProfessional){
+ //Pro版のみタブの色を表示
+ ListView_Column.cx=80;
+ ListView_Column.pszText="タブの色";
+ ListView_Column.iSubItem++;
+ ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+ }
+
+
+ pobj_nv->pobj_ExtLink->ResetListView(hListView);
+ break;
+ case WM_COMMAND:
+ switch(LOWORD(wParam)){
+ case IDC_ADD_BUTTON:
+ if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_EXTENSION_ADD),hwnd,DlgFileLinkAdd,0)) return 1;
+
+ pobj_nv->pobj_ExtLink->ResetListView(GetDlgItem(hwnd,IDC_EXTENSION_LIST));
+
+ return 1;
+ case IDC_EDIT_BUTTON:
+ hListView=GetDlgItem(hwnd,IDC_EXTENSION_LIST);
+
+ for(i=0;ipobj_ExtLink->ppobj_ExtItems[i])) return 1;
+
+ pobj_nv->pobj_ExtLink->ResetListView(GetDlgItem(hwnd,IDC_EXTENSION_LIST));
+
+ return 1;
+ case IDC_DELETE_BUTTON:
+ hListView=GetDlgItem(hwnd,IDC_EXTENSION_LIST);
+
+ for(i=0;i