Add Linux support
This commit is contained in:
90
Source/FasmOnDelphi.pas
Normal file → Executable file
90
Source/FasmOnDelphi.pas
Normal file → Executable file
@@ -19,10 +19,15 @@ interface
|
|||||||
{$UNDEF USEIOUtils}
|
{$UNDEF USEIOUtils}
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF FPC}
|
||||||
|
{$MODE Delphi}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
uses
|
uses
|
||||||
SysUtils,
|
SysUtils,
|
||||||
{$IFDEF USEFasm4Delphi}Fasm4Delphi,{$ENDIF}
|
{$IFDEF USEFasm4Delphi}Fasm4Delphi,{$ENDIF}
|
||||||
{$IFDEF USEIOUtils}System.IOUtils,{$ENDIF}Windows,Math;
|
{$IFDEF USEIOUtils}System.IOUtils,{$ENDIF}
|
||||||
|
{$IFDEF MSWINDOWS}Windows,{$ELSE}Unix,{$ENDIF}Math;
|
||||||
|
|
||||||
type
|
type
|
||||||
TFasmVersion={$IFDEF USEFasm4Delphi}Fasm4Delphi.TFasmVersion;
|
TFasmVersion={$IFDEF USEFasm4Delphi}Fasm4Delphi.TFasmVersion;
|
||||||
@@ -179,8 +184,12 @@ procedure SetFasmTemp(Path:string);
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
{$IFDEF FPC}
|
{$IFDEF FPC}
|
||||||
|
{$IFDEF MSWINDOWS}
|
||||||
function GetLongPathNameA(lpszShortPath: LPSTR; lpszLongPath: LPSTR;
|
function GetLongPathNameA(lpszShortPath: LPSTR; lpszLongPath: LPSTR;
|
||||||
cchBuffer: DWORD): DWORD; stdcall;external 'Kernel32.dll';
|
cchBuffer: DWORD): DWORD; stdcall;external 'Kernel32.dll';
|
||||||
|
{$ELSE}
|
||||||
|
type TBinFile=File Of byte;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
function Pos(const SubStr,Str:AnsiString;Offset:Integer=0):Integer;
|
function Pos(const SubStr,Str:AnsiString;Offset:Integer=0):Integer;
|
||||||
var
|
var
|
||||||
@@ -211,6 +220,7 @@ var
|
|||||||
IsDll:boolean=false;
|
IsDll:boolean=false;
|
||||||
|
|
||||||
function RunFasm(Command:AnsiString):string;
|
function RunFasm(Command:AnsiString):string;
|
||||||
|
{$IFDEF MSWINDOWS}
|
||||||
var
|
var
|
||||||
StartupInfo:TStartupInfo;
|
StartupInfo:TStartupInfo;
|
||||||
ProcessInformation:TProcessInformation;
|
ProcessInformation:TProcessInformation;
|
||||||
@@ -244,6 +254,25 @@ CloseHandle(StartupInfo.hStdOutput);
|
|||||||
CloseHandle(ProcessInformation.hThread);
|
CloseHandle(ProcessInformation.hThread);
|
||||||
CloseHandle(ProcessInformation.hProcess);
|
CloseHandle(ProcessInformation.hProcess);
|
||||||
end;
|
end;
|
||||||
|
{$ELSE}
|
||||||
|
var
|
||||||
|
OutPut:Text;
|
||||||
|
s,ss:string;
|
||||||
|
begin
|
||||||
|
popen(OutPut,FasmLocation+' '+Command,'r');
|
||||||
|
sleep(100);
|
||||||
|
Readln(OutPut,Result);
|
||||||
|
ss:=Result;
|
||||||
|
s:='';
|
||||||
|
while(ss<>s)do
|
||||||
|
begin
|
||||||
|
ss:=s;
|
||||||
|
Read(OutPut,s);
|
||||||
|
Result:=Result+sLineBreak+s;
|
||||||
|
end;
|
||||||
|
pclose(Output);
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
function FasmVersion:TFasmVersion;
|
function FasmVersion:TFasmVersion;
|
||||||
const
|
const
|
||||||
@@ -284,11 +313,18 @@ var
|
|||||||
Mem:PFASM_STATE;
|
Mem:PFASM_STATE;
|
||||||
p:PLINE_HEADER;
|
p:PLINE_HEADER;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
|
{$IFDEF MSWINDOWS}
|
||||||
p:pointer;
|
p:pointer;
|
||||||
|
{$ENDIF}
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
s,s0:string;
|
s,s0:string;
|
||||||
nr:cardinal;
|
nr:cardinal;
|
||||||
|
{$IFDEF MSWINDOWS}
|
||||||
FileHandle:THandle;
|
FileHandle:THandle;
|
||||||
|
{$ELSE}
|
||||||
|
f:Text;
|
||||||
|
bf:TBinFile;
|
||||||
|
{$ENDIF}
|
||||||
i,i1:NativeUInt;
|
i,i1:NativeUInt;
|
||||||
i0:TFasmError;
|
i0:TFasmError;
|
||||||
begin
|
begin
|
||||||
@@ -328,10 +364,17 @@ end
|
|||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
s:=FasmTemp+GetTickCount.ToString();
|
s:=FasmTemp+GetTickCount64.ToString();
|
||||||
|
{$IFDEF MSWINDOWS}
|
||||||
FileHandle:=CreateFile(PChar(s+'.in'),GENERIC_WRITE,0,nil,CREATE_ALWAYS,128,0);
|
FileHandle:=CreateFile(PChar(s+'.in'),GENERIC_WRITE,0,nil,CREATE_ALWAYS,128,0);
|
||||||
WriteFile(FileHandle,PAnsiChar(Source)^,length(Source),nr,nil);
|
WriteFile(FileHandle,PAnsiChar(Source)^,length(Source),nr,nil);
|
||||||
CloseHandle(FileHandle);
|
CloseHandle(FileHandle);
|
||||||
|
{$ELSE}
|
||||||
|
AssignFile(f,PChar(s+'.in'));
|
||||||
|
rewrite(f);
|
||||||
|
write(f,Source);
|
||||||
|
closeFile(f);
|
||||||
|
{$ENDIF}
|
||||||
Result.OutStr:=RunFasm('-m '+trunc(cbMemorySize/1024).ToString+' -p '+nPassesLimit.ToString+' '+
|
Result.OutStr:=RunFasm('-m '+trunc(cbMemorySize/1024).ToString+' -p '+nPassesLimit.ToString+' '+
|
||||||
s+'.in '+s);
|
s+'.in '+s);
|
||||||
DeleteFile(PChar(s+'.in'));
|
DeleteFile(PChar(s+'.in'));
|
||||||
@@ -345,11 +388,20 @@ begin
|
|||||||
Result.Error:=i0;
|
Result.Error:=i0;
|
||||||
if Result.Error=FASM_OK then
|
if Result.Error=FASM_OK then
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF MSWINDOWS}
|
||||||
FileHandle:=CreateFile(PChar(s),GENERIC_READ,0,nil,3,128,0);
|
FileHandle:=CreateFile(PChar(s),GENERIC_READ,0,nil,3,128,0);
|
||||||
Result.sb:=GetFileSize(FileHandle,nil);
|
Result.sb:=GetFileSize(FileHandle,nil);
|
||||||
getmem(Result.OutData,Result.sb);
|
getmem(Result.OutData,Result.sb);
|
||||||
ReadFile(FileHandle,Result.OutData^,Result.sb,nr,nil);
|
ReadFile(FileHandle,Result.OutData^,Result.sb,nr,nil);
|
||||||
CloseHandle(FileHandle);
|
CloseHandle(FileHandle);
|
||||||
|
{$ELSE}
|
||||||
|
AssignFile(bf,PChar(s));
|
||||||
|
reset(bf);
|
||||||
|
Result.sb:=FileSize(bf);
|
||||||
|
getmem(Result.OutData,Result.sb);
|
||||||
|
blockread(bf,Result.OutData^,Result.sb);
|
||||||
|
closeFile(bf);
|
||||||
|
{$ENDIF}
|
||||||
DeleteFile(PChar(s));
|
DeleteFile(PChar(s));
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -384,11 +436,17 @@ var
|
|||||||
Mem:PFASM_STATE;
|
Mem:PFASM_STATE;
|
||||||
p:PLINE_HEADER;
|
p:PLINE_HEADER;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
|
{$IFDEF MSWINDOWS}
|
||||||
p:pointer;
|
p:pointer;
|
||||||
|
{$ENDIF}
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
s,s0:string;
|
s,s0:string;
|
||||||
nr:cardinal;
|
nr:cardinal;
|
||||||
|
{$IFDEF MSWINDOWS}
|
||||||
FileHandle:THandle;
|
FileHandle:THandle;
|
||||||
|
{$ELSE}
|
||||||
|
f:Text;
|
||||||
|
{$ENDIF}
|
||||||
i,i1:NativeUInt;
|
i,i1:NativeUInt;
|
||||||
i0:TFasmError;
|
i0:TFasmError;
|
||||||
begin
|
begin
|
||||||
@@ -428,10 +486,17 @@ end
|
|||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
s:=FasmTemp+GetTickCount.ToString();
|
s:=FasmTemp+GetTickCount64.ToString();
|
||||||
|
{$IFDEF MSWINDOWS}
|
||||||
FileHandle:=CreateFile(PChar(s),GENERIC_WRITE,0,nil,CREATE_ALWAYS,128,0);
|
FileHandle:=CreateFile(PChar(s),GENERIC_WRITE,0,nil,CREATE_ALWAYS,128,0);
|
||||||
WriteFile(FileHandle,PAnsiChar(Source)^,length(Source),nr,nil);
|
WriteFile(FileHandle,PAnsiChar(Source)^,length(Source),nr,nil);
|
||||||
CloseHandle(FileHandle);
|
CloseHandle(FileHandle);
|
||||||
|
{$ELSE}
|
||||||
|
AssignFile(f,PChar(s));
|
||||||
|
rewrite(f);
|
||||||
|
write(f,Source);
|
||||||
|
closeFile(f);
|
||||||
|
{$ENDIF}
|
||||||
Result.OutStr:=RunFasm('-m '+trunc(cbMemorySize/1024).ToString+' -p '+nPassesLimit.ToString+' '+
|
Result.OutStr:=RunFasm('-m '+trunc(cbMemorySize/1024).ToString+' -p '+nPassesLimit.ToString+' '+
|
||||||
s+' '+OutFile);
|
s+' '+OutFile);
|
||||||
DeleteFile(PChar(s));
|
DeleteFile(PChar(s));
|
||||||
@@ -479,7 +544,11 @@ var
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
s,s0:string;
|
s,s0:string;
|
||||||
nr:cardinal;
|
nr:cardinal;
|
||||||
|
{$IFDEF MSWINDOWS}
|
||||||
FileHandle:THandle;
|
FileHandle:THandle;
|
||||||
|
{$ELSE}
|
||||||
|
bf:TBinFile;
|
||||||
|
{$ENDIF}
|
||||||
i,i1:NativeUInt;
|
i,i1:NativeUInt;
|
||||||
i0:TFasmError;
|
i0:TFasmError;
|
||||||
begin
|
begin
|
||||||
@@ -532,11 +601,20 @@ begin
|
|||||||
Result.Error:=i0;
|
Result.Error:=i0;
|
||||||
if Result.Error=FASM_OK then
|
if Result.Error=FASM_OK then
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF MSWINDOWS}
|
||||||
FileHandle:=CreateFile(PChar(s),GENERIC_READ,0,nil,3,128,0);
|
FileHandle:=CreateFile(PChar(s),GENERIC_READ,0,nil,3,128,0);
|
||||||
Result.sb:=GetFileSize(FileHandle,nil);
|
Result.sb:=GetFileSize(FileHandle,nil);
|
||||||
getmem(Result.OutData,Result.sb);
|
getmem(Result.OutData,Result.sb);
|
||||||
ReadFile(FileHandle,Result.OutData^,Result.sb,nr,nil);
|
ReadFile(FileHandle,Result.OutData^,Result.sb,nr,nil);
|
||||||
CloseHandle(FileHandle);
|
CloseHandle(FileHandle);
|
||||||
|
{$ELSE}
|
||||||
|
AssignFile(bf,s);
|
||||||
|
reset(bf);
|
||||||
|
Result.sb:=FileSize(bf);
|
||||||
|
getmem(Result.OutData,Result.sb);
|
||||||
|
blockread(bf,Result.OutData^,Result.sb);
|
||||||
|
closeFile(bf);
|
||||||
|
{$ENDIF}
|
||||||
DeleteFile(PChar(s));
|
DeleteFile(PChar(s));
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -677,13 +755,13 @@ begin
|
|||||||
FasmTemp:=Path;
|
FasmTemp:=Path;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$IFDEF FPC}{$IFDEF WINDOWS}
|
{$IFDEF FPC}{$IFDEF MSWINDOWS}
|
||||||
var
|
var
|
||||||
Len:Integer;
|
Len:Integer;
|
||||||
{$ENDIF}{$ENDIF}
|
{$ENDIF}{$ENDIF}
|
||||||
initialization
|
initialization
|
||||||
{$IFDEF FPC}
|
{$IFDEF FPC}
|
||||||
{$IFDEF WINDOWS}
|
{$IFDEF MSWINDOWS}
|
||||||
begin
|
begin
|
||||||
SetLength(FasmTemp,MAX_PATH);
|
SetLength(FasmTemp,MAX_PATH);
|
||||||
Len:=GetTempPath(MAX_PATH,PChar(FasmTemp));
|
Len:=GetTempPath(MAX_PATH,PChar(FasmTemp));
|
||||||
@@ -697,7 +775,7 @@ begin
|
|||||||
FasmTemp:='';
|
FasmTemp:='';
|
||||||
end;
|
end;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
FasmTemp:='/tmp';
|
FasmTemp:='/tmp/';
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
FasmTemp:=TPath.GetTempPath;
|
FasmTemp:=TPath.GetTempPath;
|
||||||
|
|||||||
Reference in New Issue
Block a user