Changeset 28 for trunk/Compiler


Ignore:
Timestamp:
Feb 13, 2012, 12:26:12 PM (13 years ago)
Author:
chronos
Message:
  • Fixed: Compile and run C project using MinGW gcc.
Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk

    • Property svn:ignore
      •  

        old new  
        44backup
        55LazFuckIDE
         6compiled
  • trunk/Compiler/UCompiler.pas

    r25 r28  
    66
    77uses
    8   Classes, SysUtils, StrUtils, Registry, URegistry, SpecializedList;
     8  Classes, SysUtils, StrUtils, Registry, URegistry, SpecializedList,
     9  FileUtil, Process;
    910
    1011type
     
    2627    SourceExtension: string;
    2728    CompiledExtension: string;
     29    ProjectFileName: string;
    2830    constructor Create; virtual;
    2931    procedure OptimizeSource;
    3032    procedure Compile; virtual;
     33    procedure CompileToFile; virtual;
     34    procedure Run; virtual;
    3135  end;
    3236
     
    3943
    4044
     45resourcestring
     46  SCompilerNotFound = 'Compiler "%s" not found';
     47  SCompiledFileNotFound = 'Program compiled file "%s" not found';
     48
     49
    4150implementation
     51
    4252
    4353{ TCompilerList }
     
    99109end;
    100110
     111procedure TBrainFuckCompiler.CompileToFile;
     112var
     113  Process: TProcess;
     114  CompiledFile: string;
     115begin
     116  CompiledFile := ExtractFilePath(ProjectFileName) +
     117    'compiled' + DirectorySeparator + Name + DirectorySeparator +
     118    ExtractFileNameOnly(ProjectFileName) + SourceExtension;
     119  ForceDirectoriesUTF8(ExtractFilePath(CompiledFile));
     120  with TStringList.Create do
     121  try
     122    Text := Output;
     123    SaveToFile(CompiledFile);
     124  finally
     125    Free;
     126  end;
     127  if FileExistsUTF8(CompilerPath) then
     128  try
     129    Process := TProcess.Create(nil);
     130    Process.CurrentDirectory := ExtractFilePath(CompilerPath);
     131    Process.CommandLine := '"' + CompilerPath + '" "' + CompiledFile + '"';
     132    Process.Options := [poWaitOnExit];
     133    Process.Execute;
     134  finally
     135    Process.Free;
     136  end else raise Exception.Create(Format(SCompilerNotFound, [CompilerPath]));
     137end;
     138
     139procedure TBrainFuckCompiler.Run;
     140var
     141  CompiledFile: string;
     142  Process: TProcess;
     143begin
     144  CompiledFile := ExtractFilePath(ProjectFileName) +
     145    'compiled' + DirectorySeparator + Name + DirectorySeparator +
     146    ExtractFileNameOnly(ProjectFileName) + CompiledExtension;
     147  if FileExistsUTF8(CompiledFile) then
     148  try
     149    Process := TProcess.Create(nil);
     150    Process.CommandLine := '"' + CompiledFile + '"';
     151    Process.Options := [poWaitOnExit];
     152    Process.Execute;
     153  finally
     154    Process.Free;
     155  end else raise Exception.Create(Format(SCompiledFileNotFound, [CompiledFile]));
     156end;
     157
    101158
    102159
  • trunk/Compiler/UCompilerC.pas

    r27 r28  
    66
    77uses
    8   Classes, SysUtils, UCompiler;
     8  Classes, SysUtils, FileUtil, UCompiler, Process;
    99
    1010type
     
    1515    constructor Create; override;
    1616    procedure Compile; override;
     17    procedure CompileToFile; override;
     18    procedure Run; override;
    1719  end;
    1820
     
    2830  CompiledExtension := '.exe';
    2931  {$IFDEF Windows}
    30   CompilerPath := 'C:\Program Files\Dev-Cpp\mingw32-gcc.exe';
     32  CompilerPath := 'c:\Program Files\MinGW\bin\gcc.exe -o %1:s';
    3133  {$ENDIF}
    3234  {$IFDEF Linux}
     
    5961  AddLine('{');
    6062  Inc(Indent);
    61   AddLine('char[30000] Memory;');
     63  AddLine('char Memory[30000];');
    6264  AddLine('int Pos;');
    6365  AddLine('char ReadChar;');
     
    8385        AddLine('Memory[Pos] = Memory[Pos] - ' + IntToStr(Sum) + ';');
    8486      end;
    85       '.': AddLine('putc(Memory[Pos]);');
    86       ',': AddLine('getc(Memory[Pos]);');
     87      '.': AddLine('putchar(Memory[Pos]);');
     88      ',': AddLine('Memory[Pos] = getchar();');
    8789      '[': begin
    88         AddLine('while(Memory[Pos] <> 0)');
     90        AddLine('while(Memory[Pos] != 0)');
    8991        AddLine('{');
    9092        Inc(Indent);
     
    102104end;
    103105
     106procedure TBrainFuckCompilerC.CompileToFile;
     107var
     108  Process: TProcess;
     109  CompiledFile: string;
     110begin
     111  CompiledFile := ExtractFilePath(ProjectFileName) +
     112    'compiled' + DirectorySeparator + Name + DirectorySeparator +
     113    ExtractFileNameOnly(ProjectFileName) + SourceExtension;
     114  ForceDirectoriesUTF8(ExtractFilePath(CompiledFile));
     115  with TStringList.Create do
     116  try
     117    Text := Output;
     118    SaveToFile(CompiledFile);
     119  finally
     120    Free;
     121  end;
     122  if FileExistsUTF8(CompilerPath) then
     123  try
     124    Process := TProcess.Create(nil);
     125    Process.CurrentDirectory := ExtractFilePath(CompilerPath);
     126    Process.CommandLine := '"' + CompilerPath + '" "' + CompiledFile + '" -o ' +
     127      ExtractFilePath(CompiledFile) + ExtractFileNameOnly(CompiledFile) + CompiledExtension;
     128    Process.Options := [poWaitOnExit];
     129    Process.Execute;
     130  finally
     131    Process.Free;
     132  end else raise Exception.Create(Format(SCompilerNotFound, [CompilerPath]));
     133end;
     134
     135procedure TBrainFuckCompilerC.Run;
     136begin
     137  inherited Run;
     138end;
     139
    104140end.
    105141
  • trunk/Compiler/UCompilerPHP.pas

    r26 r28  
    1515    constructor Create; override;
    1616    procedure Compile; override;
     17    procedure Run; override;
    1718  end;
    1819
     
    9293end;
    9394
     95procedure TBrainFuckCompilerPHP.Run;
     96begin
     97  inherited Run;
     98end;
     99
    94100end.
    95101
Note: See TracChangeset for help on using the changeset viewer.