1
0
mirror of https://github.com/moparisthebest/Simba synced 2024-11-26 03:02:15 -05:00

Added PlaySound for Windows, fixed the way errordata is displayed (PascalScript mucks up at returning the right coordinates..)

Added Include_once, made it look for includes in more dirs (scriptpath, includepath and the current-file-path, fixed bug in Bitmaps where it would not set the bitmap to 'nil' in the actual BMP array. Fixed bug in ScriptPath (it would not include a trailing delimiter)

git-svn-id: http://www.villavu.com/repositories/merlijn/mufasa@558 3f818213-9676-44b0-a9b4-5e4c4e03d09d
This commit is contained in:
Raymond 2010-02-26 16:59:05 +00:00
parent e6027ce05c
commit 4bd62c7237
7 changed files with 118 additions and 60 deletions

View File

@ -247,9 +247,7 @@ begin
if ErrorData.Module <> '' then if ErrorData.Module <> '' then
begin; begin;
if not FileExists(ErrorData.Module) then if not FileExists(ErrorData.Module) then
ErrorData.Module := ErrorData.IncludePath + ErrorData.Module; Writeln(Format('ERROR comes from a non-existing file (%s)',[ErrorData.Module]))
if not FileExists(ErrorData.Module) then
Writeln('ERROR comes from a non-existing file....')
else else
begin begin
ErrorData.Module:= SetDirSeparators(ErrorData.Module);// Set it right ;-) ErrorData.Module:= SetDirSeparators(ErrorData.Module);// Set it right ;-)
@ -270,13 +268,16 @@ begin
end; end;
end; end;
MakeActiveScriptFrame; MakeActiveScriptFrame;
ScriptErrorLine:= ErrorData.Line; ScriptErrorLine:= ErrorData.Row;
SynEdit.Invalidate; SynEdit.Invalidate;
SynEdit.SelStart:= ErrorData.Position; if ErrorData.Col = -1 then
if pos('error',lowercase(ErrorData.Error)) > 0 then SynEdit.SelStart:= ErrorData.Position
formWriteln(Format('%s at line %d',[ErrorData.Error,ErrorData.Line]))
else else
formWriteln(Format('Error: %s at line %d',[ErrorData.Error,ErrorData.Line])); SynEdit.LogicalCaretXY := Point(ErrorData.Col,ErrorData.Row);
if pos('error',lowercase(ErrorData.Error)) > 0 then
formWriteln(Format('%s at line %d',[ErrorData.Error,ErrorData.Row]))
else
formWriteln(Format('Error: %s at line %d',[ErrorData.Error,ErrorData.Row]));
end; end;
procedure TScriptFrame.MakeActiveScriptFrame; procedure TScriptFrame.MakeActiveScriptFrame;
@ -342,6 +343,7 @@ begin
MarkCaret.IgnoreKeywords := true; MarkCaret.IgnoreKeywords := true;
end; end;
AddKey(SynEdit,ecCodeCompletion,VK_SPACE,[ssCtrl]); AddKey(SynEdit,ecCodeCompletion,VK_SPACE,[ssCtrl]);
// TSynPasSyn(SynEdit.Highlighter).NestedComments:= false; Does not work :(
end; end;
destructor TScriptFrame.Destroy; destructor TScriptFrame.Destroy;

View File

@ -931,7 +931,7 @@ begin
Thread.OnError:= @CurrScript.HandleErrorData; Thread.OnError:= @CurrScript.HandleErrorData;
if CurrScript.ScriptFile <> '' then if CurrScript.ScriptFile <> '' then
ScriptPath := ExtractFileDir(CurrScript.ScriptFile); ScriptPath := IncludeTrailingPathDelimiter(ExtractFileDir(CurrScript.ScriptFile));
if DirectoryExists(PluginsPath) then if DirectoryExists(PluginsPath) then
PluginsGlob.AddPath(PluginsPath); PluginsGlob.AddPath(PluginsPath);

View File

@ -42,6 +42,24 @@ begin
end; end;
{$endif} {$endif}
procedure PlaySound( Sound : string); extdecl;
begin
{$ifdef MSWINDOWS}
sndPlaySound(PChar(sound),SND_ASYNC or SND_NODEFAULT);
{$else}
Writeln(Format('Playing sound %s (not supported yet on Linux)',[sound]);
{$endif}
end;
Procedure StopSound; extdecl;
begin;
{$ifdef MSWINDOWS}
sndPlaySoundW(nil,0);
{$else}
Writeln('Stopping sound is not supported yet on Linux');
{$endif}
end;
procedure ClearDebug; extdecl; procedure ClearDebug; extdecl;
begin begin
if Assigned(CurrThread.DebugMemo) then if Assigned(CurrThread.DebugMemo) then

View File

@ -126,6 +126,8 @@ AddFunction(@DrawBitmapDebugImg,'procedure DrawBitmapDebugImg(bmp: integer);');
AddFunction(@GetDebugBitmap,'function GetDebugBitmap: integer;'); AddFunction(@GetDebugBitmap,'function GetDebugBitmap: integer;');
AddFunction(@ps_Random,'function Random(Int: integer): integer;'); AddFunction(@ps_Random,'function Random(Int: integer): integer;');
AddFunction(@ClearDebug,'procedure ClearDebug;'); AddFunction(@ClearDebug,'procedure ClearDebug;');
AddFunction(@PlaySound,'procedure PlaySound( Sound : string);');
AddFunction(@StopSound,'Procedure StopSound;');

View File

@ -58,7 +58,7 @@ type
TErrorType = (errRuntime,errCompile); TErrorType = (errRuntime,errCompile);
TOnError = procedure of object; TOnError = procedure of object;
TErrorData = record TErrorData = record
Line,Position : integer; Row,Col,Position : integer;
Error : string; Error : string;
ErrType : TErrorType; ErrType : TErrorType;
Module : string; Module : string;
@ -78,6 +78,7 @@ type
DebugTo: TWritelnProc; DebugTo: TWritelnProc;
DebugImg : TDbgImgInfo; DebugImg : TDbgImgInfo;
ExportedMethods : TExpMethodArr; ExportedMethods : TExpMethodArr;
Includes : TStringList;
procedure LoadPlugin(plugidx: integer); virtual; abstract; procedure LoadPlugin(plugidx: integer); virtual; abstract;
public public
@ -91,9 +92,9 @@ type
OnError : TOnError; //Error handeler OnError : TOnError; //Error handeler
CompileOnly : boolean; CompileOnly : boolean;
procedure HandleError(ErrorAtLine,ErrorPosition : integer; ErrorStr : string; ErrorType : TErrorType; ErrorModule : string); procedure HandleError(ErrorRow,ErrorCol,ErrorPosition : integer; ErrorStr : string; ErrorType : TErrorType; ErrorModule : string);
function ProcessDirective(DirectiveName, DirectiveArgs: string): boolean; function ProcessDirective(DirectiveName, DirectiveArgs: string): boolean;
function LoadFile(var filename, contents: string): boolean; function LoadFile(ParentFile : string; var filename, contents: string): boolean;
procedure AddMethod(meth: TExpMethod); virtual; procedure AddMethod(meth: TExpMethod); virtual;
procedure SetScript(Script : string); procedure SetScript(Script : string);
@ -174,7 +175,7 @@ implementation
uses uses
colour_conv,dtmutil, colour_conv,dtmutil,
{$ifdef mswindows}windows,{$endif} {$ifdef mswindows}windows, MMSystem,{$endif}//MMSystem -> Sounds
uPSC_std, uPSC_controls,uPSC_classes,uPSC_graphics,uPSC_stdctrls,uPSC_forms, uPSC_std, uPSC_controls,uPSC_classes,uPSC_graphics,uPSC_stdctrls,uPSC_forms,
uPSC_extctrls, //Compile-libs uPSC_extctrls, //Compile-libs
uPSUtils, uPSUtils,
@ -273,6 +274,8 @@ begin
CompileOnly := false; CompileOnly := false;
OnTerminate := @OnThreadTerminate; OnTerminate := @OnThreadTerminate;
OnError:= nil; OnError:= nil;
Includes := TStringList.Create;
Includes.CaseSensitive:= {$ifdef linux}true{$else}false{$endif};
inherited Create(CreateSuspended); inherited Create(CreateSuspended);
end; end;
@ -280,14 +283,16 @@ destructor TMThread.Destroy;
begin begin
MInternet.Free; MInternet.Free;
Client.Free; Client.Free;
Includes.free;
inherited Destroy; inherited Destroy;
end; end;
procedure TMThread.HandleError(ErrorAtLine, ErrorPosition: integer; ErrorStr: string; ErrorType: TErrorType; ErrorModule : string); procedure TMThread.HandleError(ErrorRow,ErrorCol, ErrorPosition: integer; ErrorStr: string; ErrorType: TErrorType; ErrorModule : string);
begin begin
if OnError = nil then if OnError = nil then
exit; exit;
ErrorData^.Line:= ErrorAtLine; ErrorData^.Row:= ErrorRow;
ErrorData^.Col := ErrorCol;
ErrorData^.Position:= ErrorPosition; ErrorData^.Position:= ErrorPosition;
ErrorData^.Error:= ErrorStr; ErrorData^.Error:= ErrorStr;
ErrorData^.ErrType:= ErrorType; ErrorData^.ErrType:= ErrorType;
@ -305,10 +310,57 @@ procedure TMThread.AddMethod(meth: TExpMethod);
begin begin
end; end;
function FindFile(filename : string; Dirs : array of string) : string; //Results '' if not found
var
i : integer;
begin;
if fileexists(filename) then
result := filename
else
begin
for i := 0 to high(Dirs) do
if DirectoryExists(dirs[i]) then
if fileexists(dirs[i] + filename) then
begin
result := dirs[i] + filename;
exit;
end;
end;
end;
function TMThread.LoadFile(ParentFile : string; var filename, contents: string): boolean;
var
path: string;
f: TFileStream;
begin
path := FindFile(filename,[includepath,ScriptPath,IncludeTrailingPathDelimiter(ExtractFileDir(parentfile))]);
if path = '' then
begin
psWriteln(Path + ' doesn''t exist');
Result := false;
Exit;
end;
filename := path;//Yeah!
Includes.Add(path);
try
f:= TFileStream.Create(Path, fmOpenRead or fmShareDenyWrite);
SetLength(contents, f.Size);
f.Read(contents[1], Length(contents));
result:= true;
f.free;
except
Result := false;
psWriteln('ERROR in TMThread.LoadFile');
end;
end;
function TMThread.ProcessDirective(DirectiveName, DirectiveArgs: string): boolean; function TMThread.ProcessDirective(DirectiveName, DirectiveArgs: string): boolean;
var var
plugin_idx, i: integer; plugin_idx, i: integer;
path : string;
begin begin
result := false;
if CompareText(DirectiveName,'LOADDLL') = 0 then if CompareText(DirectiveName,'LOADDLL') = 0 then
begin begin
if DirectiveArgs <> '' then if DirectiveArgs <> '' then
@ -316,45 +368,28 @@ begin
plugin_idx:= PluginsGlob.LoadPlugin(DirectiveArgs); plugin_idx:= PluginsGlob.LoadPlugin(DirectiveArgs);
if plugin_idx < 0 then if plugin_idx < 0 then
psWriteln(Format('Your DLL %s has not been found',[DirectiveArgs])) psWriteln(Format('Your DLL %s has not been found',[DirectiveArgs]))
else else begin
LoadPlugin(plugin_idx); LoadPlugin(plugin_idx);
end; result:= True;
end; end;
result:= True; end else
end; psWriteln('Your LoadDLL directive has no params, thus cannot find the plugin');
end else
function TMThread.LoadFile(var filename, contents: string): boolean; if CompareText(DirectiveName,'INCLUDE_ONCE') = 0 then
var
path: string;
f: TFileStream;
begin
if FileExists(filename) then
path:= filename
else
path:= IncludePath + filename;
if not FileExists(path) then
begin begin
psWriteln(Path + ' doesn''t exist'); result := true; //Lets to the actual file checking later on in the preprocessor ;-)
Result := false; if DirectiveArgs <> '' then
Exit; begin
end; path := FindFile(DirectiveArgs,[ScriptPath,IncludePath]);
try if path <> '' then
f:= TFileStream.Create(Path, fmOpenRead or fmShareDenyWrite); if Includes.Find(path,i) then
except begin
Result := false; psWriteln('Include_Once file already included');
exit; result := false;
end; end;
try
try
SetLength(contents, f.Size);
f.Read(contents[1], Length(contents));
result:= true;
finally
f.free;
end; end;
except end else
result:= false; result := true;
end;
end; end;
procedure TMThread.SetDebug(writelnProc: TWritelnProc); procedure TMThread.SetDebug(writelnProc: TWritelnProc);
@ -376,8 +411,9 @@ begin
FontPath:= FontP; FontPath:= FontP;
end; end;
function ThreadSafeCall(ProcName: string; var V: TVariantArray): Variant; stdcall; function ThreadSafeCall(ProcName: string; var V: TVariantArray): Variant; extdecl;
begin begin
Writeln('yo');
CurrThread.SyncInfo^.MethodName:= ProcName; CurrThread.SyncInfo^.MethodName:= ProcName;
CurrThread.SyncInfo^.V:= V; CurrThread.SyncInfo^.V:= V;
CurrThread.SyncInfo^.OldThread := CurrThread; CurrThread.SyncInfo^.OldThread := CurrThread;
@ -550,7 +586,7 @@ end;
function TPSThread.RequireFile(Sender: TObject; function TPSThread.RequireFile(Sender: TObject;
const OriginFileName: String; var FileName, OutPut: string): Boolean; const OriginFileName: String; var FileName, OutPut: string): Boolean;
begin begin
result:= LoadFile(FileName,OutPut); result:= LoadFile(OriginFileName,FileName,OutPut);
end; end;
procedure SIRegister_Mufasa(cl: TPSPascalCompiler); procedure SIRegister_Mufasa(cl: TPSPascalCompiler);
@ -659,7 +695,7 @@ begin
b := True; b := True;
if OnError <> nil then if OnError <> nil then
with PSScript.CompilerMessages[l] do with PSScript.CompilerMessages[l] do
HandleError(Row, Pos, MessageToString,errCompile, ModuleName) HandleError(Row, Col, Pos, MessageToString,errCompile, ModuleName)
else else
psWriteln(PSScript.CompilerErrorToStr(l) + ' at line ' + inttostr(PSScript.CompilerMessages[l].Row)); psWriteln(PSScript.CompilerErrorToStr(l) + ' at line ' + inttostr(PSScript.CompilerMessages[l].Row));
end else end else
@ -682,7 +718,7 @@ begin
exit; exit;
// if not (ScriptState = SCompiling) then // if not (ScriptState = SCompiling) then
if not PSScript.Execute then if not PSScript.Execute then
HandleError(PSScript.ExecErrorRow,PSScript.ExecErrorPosition,PSScript.ExecErrorToString, HandleError(PSScript.ExecErrorRow,PSScript.ExecErrorCol,PSScript.ExecErrorPosition,PSScript.ExecErrorToString,
errRuntime, PSScript.ExecErrorFileName) errRuntime, PSScript.ExecErrorFileName)
else else
psWriteln('Succesfully executed'); psWriteln('Succesfully executed');
@ -733,9 +769,9 @@ end;
procedure Interpreter_ErrorHandler(line, pos: integer; err: PChar; runtime: boolean); stdcall; procedure Interpreter_ErrorHandler(line, pos: integer; err: PChar; runtime: boolean); stdcall;
begin begin
if runtime then if runtime then
CurrThread.HandleError(line,pos,err,errRuntime,'') CurrThread.HandleError(line,-1,pos,err,errRuntime,'')
else else
CurrThread.HandleError(line,pos,err,errCompile,'') CurrThread.HandleError(line,-1,pos,err,errCompile,'')
end; end;
constructor TCPThread.Create(CreateSuspended: Boolean; TheSyncInfo : PSyncInfo; plugin_dir: string); constructor TCPThread.Create(CreateSuspended: Boolean; TheSyncInfo : PSyncInfo; plugin_dir: string);

View File

@ -395,7 +395,8 @@ begin
Writeln(Format('BMP[%d] has been freed.',[number])) Writeln(Format('BMP[%d] has been freed.',[number]))
else else
Writeln(Format('BMP[%s] has been freed.',[ToDestroy.BmpName])); Writeln(Format('BMP[%s] has been freed.',[ToDestroy.BmpName]));
FreeAndNil(ToDestroy); ToDestroy.Free;
BmpArray[number] := nil;
end; end;
function TMufasaBitmap.SaveToFile(const FileName: string): boolean; function TMufasaBitmap.SaveToFile(const FileName: string): boolean;

View File

@ -611,11 +611,10 @@ begin
//-- 20050707_jgv - ask the application //-- 20050707_jgv - ask the application
AppContinue := True; AppContinue := True;
If @OnProcessDirective <> Nil then OnProcessDirective (Self, Parser, FDefineState.DoWrite, name, s, AppContinue); If @OnProcessDirective <> Nil then OnProcessDirective (Self, Parser, FDefineState.DoWrite, name, s, AppContinue);
If AppContinue then If AppContinue then
//-- end jgv //-- end jgv
if (Name = 'I') or (Name = 'INCLUDE') or (Name = '.INCLUDE') then if (Name = 'I') or (Name = 'INCLUDE') or (Name = 'INCLUDE_ONCE') then
begin begin
if FDefineState.DoWrite then if FDefineState.DoWrite then
begin begin