Initial commit
This commit is contained in:
commit
b946dbcca5
750
Lua.Wrapper.pas
Normal file
750
Lua.Wrapper.pas
Normal file
@ -0,0 +1,750 @@
|
||||
unit Lua.Wrapper;
|
||||
|
||||
interface
|
||||
uses
|
||||
System.Classes,
|
||||
System.Generics.Collections,
|
||||
System.SysUtils,
|
||||
|
||||
Lua;
|
||||
|
||||
type
|
||||
ELuaException = class(Exception);
|
||||
ELuaInitException = class(ELuaException);
|
||||
|
||||
TLuaLibrary = (Base, Coroutine, Table, IO, OS, StringLib, Bit32, Math, Debug, Package, All);
|
||||
TLuaLibraries = set of TLuaLibrary;
|
||||
|
||||
TLuaDataType = (LuaNone, LuaNil, LuaNumber, LuaBoolean, LuaString, LuaTable,
|
||||
LuaCFunction, LuaUserData, LuaThread, LuaLightUserData);
|
||||
|
||||
ILuaParameter = interface
|
||||
['{ADA0D4FB-F0FB-4493-8FEC-6FC92C80117F}']
|
||||
function GetAsBoolean: Boolean;
|
||||
function GetAsInteger: Integer;
|
||||
function GetAsNumber: Double;
|
||||
function GetAsUserData: Pointer;
|
||||
function GetAsString: string;
|
||||
function GetDataType: TLuaDataType;
|
||||
function GetIndex: Integer;
|
||||
|
||||
property AsBoolean: Boolean read GetAsBoolean;
|
||||
property AsInteger: Integer read GetAsInteger;
|
||||
property AsNumber: Double read GetAsNumber;
|
||||
property AsUserData: Pointer read GetAsUserData;
|
||||
property AsString: string read GetAsString;
|
||||
property DataType: TLuaDataType read GetDataType;
|
||||
|
||||
property Index: Integer read GetIndex;
|
||||
end;
|
||||
|
||||
|
||||
ILuaParameters = interface
|
||||
['{FB611D9E-B51D-460B-B5AB-B567EF853222}']
|
||||
function GetCount: Integer;
|
||||
function GetItem(Index: Integer): ILuaParameter;
|
||||
function GetState: lua_State;
|
||||
|
||||
function ToString: string;
|
||||
|
||||
property Count: Integer read GetCount;
|
||||
property Items[Index: Integer]: ILuaParameter read GetItem; default;
|
||||
|
||||
property State: lua_State read GetState;
|
||||
end;
|
||||
|
||||
|
||||
ILuaResult = interface
|
||||
['{5CEEB16B-158E-44BE-8CAD-DC2C330A244A}']
|
||||
function GetCount: Integer;
|
||||
|
||||
procedure Push(ABoolean: Boolean); overload;
|
||||
procedure Push(AInteger: Integer); overload;
|
||||
procedure Push(ANumber: Double); overload;
|
||||
procedure Push(AUserData: Pointer); overload;
|
||||
procedure Push(const AString: string); overload;
|
||||
|
||||
property Count: Integer read GetCount;
|
||||
end;
|
||||
|
||||
|
||||
ILuaContext = interface
|
||||
['{1F999593-E3D1-4195-9463-A42025AE9830}']
|
||||
function GetParameters: ILuaParameters;
|
||||
function GetResult: ILuaResult;
|
||||
|
||||
property Parameters: ILuaParameters read GetParameters;
|
||||
property Result: ILuaResult read GetResult;
|
||||
end;
|
||||
|
||||
|
||||
TLuaFunction = reference to procedure(Context: ILuaContext);
|
||||
|
||||
|
||||
TLuaRegisteredFunction = record
|
||||
Name: string;
|
||||
Callback: TLuaFunction;
|
||||
end;
|
||||
|
||||
TLuaRegisteredFunctionDictionary = TDictionary<Integer, TLuaRegisteredFunction>;
|
||||
|
||||
|
||||
TLua = class(TObject)
|
||||
private
|
||||
FState: lua_State;
|
||||
FLoaded: Boolean;
|
||||
FRegisteredFunctions: TLuaRegisteredFunctionDictionary;
|
||||
FRegisteredFunctionCookie: Integer;
|
||||
FAutoOpenLibraries: TLuaLibraries;
|
||||
|
||||
function GetHasState: Boolean;
|
||||
function GetState: lua_State;
|
||||
function GetRegisteredFunctions: TLuaRegisteredFunctionDictionary;
|
||||
protected
|
||||
function DoAlloc(APointer: Pointer; AOldSize, ANewSize: Cardinal): Pointer; virtual;
|
||||
|
||||
procedure DoNewState; virtual;
|
||||
procedure DoClose; virtual;
|
||||
procedure DoRegisterFunction(ACookie: Integer); virtual;
|
||||
|
||||
procedure SetAutoOpenLibraries(const Value: TLuaLibraries); virtual;
|
||||
protected
|
||||
procedure CheckState; virtual;
|
||||
procedure RaiseLastLuaError; virtual;
|
||||
procedure AfterLoad; virtual;
|
||||
|
||||
function GetRegisteredFunctionCookie: Integer; virtual;
|
||||
function RunRegisteredFunction(ACookie: Integer): Integer; virtual;
|
||||
|
||||
property Loaded: Boolean read FLoaded write FLoaded;
|
||||
property RegisteredFunctions: TLuaRegisteredFunctionDictionary read GetRegisteredFunctions;
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
|
||||
procedure LoadFromString(const AData: string; const AChunkName: string = ''); virtual;
|
||||
procedure LoadFromStream(AStream: TStream; AOwnership: TStreamOwnership = soReference; const AChunkName: string = ''); virtual;
|
||||
|
||||
procedure RegisterFunction(const AName: string; AFunction: TLuaFunction);
|
||||
|
||||
procedure OpenLibraries(ALibraries: TLuaLibraries); virtual;
|
||||
procedure Call; virtual;
|
||||
|
||||
property HasState: Boolean read GetHasState;
|
||||
property State: lua_State read GetState;
|
||||
|
||||
property AutoOpenLibraries: TLuaLibraries read FAutoOpenLibraries write SetAutoOpenLibraries default [TLuaLibrary.All];
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
uses
|
||||
System.Math;
|
||||
|
||||
|
||||
type
|
||||
PLuaScript = ^TLuaScript;
|
||||
TLuaScript = class(TObject)
|
||||
private
|
||||
FStream: TStream;
|
||||
FStreamOwnership: TStreamOwnership;
|
||||
FBuffer: PAnsiChar;
|
||||
public
|
||||
constructor Create(const AData: string); overload;
|
||||
constructor Create(const AStream: TStream; AOwnership: TStreamOwnership = soReference); overload;
|
||||
destructor Destroy; override;
|
||||
|
||||
function GetNextChunk(out ASize: Cardinal): PAnsiChar;
|
||||
end;
|
||||
|
||||
|
||||
TLuaParameters = class(TInterfacedObject, ILuaParameters)
|
||||
private
|
||||
FState: lua_State;
|
||||
FCount: Integer;
|
||||
protected
|
||||
property State: lua_State read FState;
|
||||
public
|
||||
constructor Create(AState: lua_State);
|
||||
|
||||
function PushResultParameters: Integer;
|
||||
public
|
||||
{ ILuaParameters }
|
||||
function GetCount: Integer;
|
||||
function GetItem(Index: Integer): ILuaParameter;
|
||||
function GetState: lua_State;
|
||||
|
||||
function ToString: string; override;
|
||||
end;
|
||||
|
||||
|
||||
TLuaParameter = class(TInterfacedObject, ILuaParameter)
|
||||
private
|
||||
FState: lua_State;
|
||||
FIndex: Integer;
|
||||
protected
|
||||
property State: lua_State read FState;
|
||||
public
|
||||
constructor Create(AState: lua_State; AIndex: Integer);
|
||||
|
||||
{ ILuaParameter }
|
||||
function GetAsBoolean: Boolean;
|
||||
function GetAsInteger: Integer;
|
||||
function GetAsNumber: Double;
|
||||
function GetAsUserData: Pointer;
|
||||
function GetAsString: string;
|
||||
function GetDataType: TLuaDataType;
|
||||
function GetIndex: Integer;
|
||||
end;
|
||||
|
||||
|
||||
TLuaResult = class(TInterfacedObject, ILuaResult)
|
||||
private
|
||||
FState: lua_State;
|
||||
FCount: Integer;
|
||||
protected
|
||||
procedure Pushed;
|
||||
|
||||
property State: lua_State read FState;
|
||||
public
|
||||
constructor Create(AState: lua_State);
|
||||
|
||||
{ ILuaResult }
|
||||
function GetCount: Integer;
|
||||
|
||||
procedure Push(ABoolean: Boolean); overload;
|
||||
procedure Push(AInteger: Integer); overload;
|
||||
procedure Push(ANumber: Double); overload;
|
||||
procedure Push(AUserData: Pointer); overload;
|
||||
procedure Push(const AString: string); overload;
|
||||
end;
|
||||
|
||||
|
||||
TLuaContext = class(TInterfacedObject, ILuaContext)
|
||||
private
|
||||
FParameters: ILuaParameters;
|
||||
FResult: ILuaResult;
|
||||
public
|
||||
constructor Create(AState: lua_State);
|
||||
|
||||
{ ILuaContext }
|
||||
function GetParameters: ILuaParameters;
|
||||
function GetResult: ILuaResult;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
{ TLuaScript }
|
||||
constructor TLuaScript.Create(const AData: string);
|
||||
begin
|
||||
Create(TStringStream.Create(AData), soOwned);
|
||||
end;
|
||||
|
||||
|
||||
constructor TLuaScript.Create(const AStream: TStream; AOwnership: TStreamOwnership);
|
||||
begin
|
||||
inherited Create;
|
||||
|
||||
FStream := AStream;
|
||||
FStreamOwnership := AOwnership;
|
||||
end;
|
||||
|
||||
|
||||
destructor TLuaScript.Destroy;
|
||||
begin
|
||||
if Assigned(FBuffer) then
|
||||
FreeMem(FBuffer);
|
||||
|
||||
if FStreamOwnership = soOwned then
|
||||
FreeAndNil(FStream);
|
||||
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
|
||||
function TLuaScript.GetNextChunk(out ASize: Cardinal): PAnsiChar;
|
||||
const
|
||||
BufferSize = 4096;
|
||||
|
||||
begin
|
||||
if not Assigned(FBuffer) then
|
||||
GetMem(FBuffer, BufferSize);
|
||||
|
||||
ASize := FStream.Read(FBuffer^, BufferSize);
|
||||
if ASize > 0 then
|
||||
Result := FBuffer
|
||||
else
|
||||
Result := nil;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
{ Callback functions }
|
||||
function LuaWrapperAlloc(ud, ptr: Pointer; osize, nsize: size_t): Pointer; cdecl;
|
||||
begin
|
||||
Result := TLua(ud).DoAlloc(ptr, osize, nsize);
|
||||
end;
|
||||
|
||||
|
||||
function LuaWrapperReader(L: lua_State; ud: Pointer; var sz: size_t): PAnsiChar; cdecl;
|
||||
var
|
||||
script: PLuaScript;
|
||||
|
||||
begin
|
||||
script := ud;
|
||||
Result := script^.GetNextChunk(sz);
|
||||
end;
|
||||
|
||||
|
||||
function LuaWrapperFunction(L: lua_State): Integer; cdecl;
|
||||
var
|
||||
lua: TLua;
|
||||
cookie: Integer;
|
||||
|
||||
begin
|
||||
Result := 0;
|
||||
|
||||
lua := TLua(lua_touserdata(L, lua_upvalueindex(1)));
|
||||
cookie := lua_tointeger(L, lua_upvalueindex(2));
|
||||
|
||||
if Assigned(lua) then
|
||||
Result := lua.RunRegisteredFunction(cookie);
|
||||
end;
|
||||
|
||||
|
||||
function NilPAnsiChar(const AValue: string): PAnsiChar;
|
||||
begin
|
||||
if Length(AValue) > 0 then
|
||||
Result := PAnsiChar(AnsiString(AValue))
|
||||
else
|
||||
Result := nil;
|
||||
end;
|
||||
|
||||
|
||||
{ TLua }
|
||||
constructor TLua.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
|
||||
FAutoOpenLibraries := [TLuaLibrary.All];
|
||||
end;
|
||||
|
||||
|
||||
destructor TLua.Destroy;
|
||||
begin
|
||||
FreeAndNil(FRegisteredFunctions);
|
||||
|
||||
if HasState then
|
||||
DoClose;
|
||||
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLua.LoadFromString(const AData: string; const AChunkName: string);
|
||||
var
|
||||
script: TLuaScript;
|
||||
|
||||
begin
|
||||
script := TLuaScript.Create(AData);
|
||||
try
|
||||
if lua_load(State, LuaWrapperReader, @script, NilPAnsiChar(AChunkName), nil) <> 0 then
|
||||
RaiseLastLuaError;
|
||||
|
||||
AfterLoad;
|
||||
finally
|
||||
FreeAndNil(script);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLua.LoadFromStream(AStream: TStream; AOwnership: TStreamOwnership; const AChunkName: string);
|
||||
var
|
||||
script: TLuaScript;
|
||||
|
||||
begin
|
||||
script := TLuaScript.Create(AStream, AOwnership);
|
||||
try
|
||||
if lua_load(State, LuaWrapperReader, @script, NilPAnsiChar(AChunkName), nil) <> 0 then
|
||||
RaiseLastLuaError;
|
||||
|
||||
AfterLoad;
|
||||
finally
|
||||
FreeAndNil(script);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLua.OpenLibraries(ALibraries: TLuaLibraries);
|
||||
begin
|
||||
if TLuaLibrary.All in ALibraries then
|
||||
luaL_openlibs(State)
|
||||
else
|
||||
begin
|
||||
if TLuaLibrary.Base in ALibraries then
|
||||
luaopen_base(State);
|
||||
|
||||
if TLuaLibrary.Coroutine in ALibraries then
|
||||
luaopen_coroutine(State);
|
||||
|
||||
if TLuaLibrary.Table in ALibraries then
|
||||
luaopen_table(State);
|
||||
|
||||
if TLuaLibrary.IO in ALibraries then
|
||||
luaopen_io(State);
|
||||
|
||||
if TLuaLibrary.OS in ALibraries then
|
||||
luaopen_os(State);
|
||||
|
||||
if TLuaLibrary.StringLib in ALibraries then
|
||||
luaopen_string(State);
|
||||
|
||||
if TLuaLibrary.Bit32 in ALibraries then
|
||||
luaopen_bit32(State);
|
||||
|
||||
if TLuaLibrary.Math in ALibraries then
|
||||
luaopen_math(State);
|
||||
|
||||
if TLuaLibrary.Debug in ALibraries then
|
||||
luaopen_debug(State);
|
||||
|
||||
if TLuaLibrary.Package in ALibraries then
|
||||
luaopen_package(State);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLua.Call;
|
||||
begin
|
||||
if lua_pcall(State, 0, 0, 0) <> 0 then
|
||||
RaiseLastLuaError;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLua.CheckState;
|
||||
begin
|
||||
if not LuaLibLoaded then
|
||||
LoadLuaLib;
|
||||
|
||||
if not HasState then
|
||||
DoNewState;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLua.RaiseLastLuaError;
|
||||
begin
|
||||
raise ELuaException.Create(string(lua_tolstring(State, -1, nil)));
|
||||
end;
|
||||
|
||||
|
||||
procedure TLua.AfterLoad;
|
||||
var
|
||||
cookie: Integer;
|
||||
|
||||
begin
|
||||
Loaded := True;
|
||||
|
||||
{ Register functions in the current environment }
|
||||
for cookie in RegisteredFunctions.Keys do
|
||||
DoRegisterFunction(cookie);
|
||||
end;
|
||||
|
||||
|
||||
procedure TLua.RegisterFunction(const AName: string; AFunction: TLuaFunction);
|
||||
var
|
||||
registeredFunction: TLuaRegisteredFunction;
|
||||
cookie: Integer;
|
||||
|
||||
begin
|
||||
{ Since anonymous methods are basically interfaces, we need to keep a reference around }
|
||||
registeredFunction.Name := AName;
|
||||
registeredFunction.Callback := AFunction;
|
||||
|
||||
cookie := GetRegisteredFunctionCookie;
|
||||
RegisteredFunctions.Add(cookie, registeredFunction);
|
||||
|
||||
{ Only register functions after Load, otherwise they'll not be available in the environment }
|
||||
if Loaded then
|
||||
DoRegisterFunction(cookie);
|
||||
end;
|
||||
|
||||
|
||||
function TLua.DoAlloc(APointer: Pointer; AOldSize, ANewSize: Cardinal): Pointer;
|
||||
begin
|
||||
Result := DefaultLuaAlloc(nil, APointer, AOldSize, ANewSize);
|
||||
end;
|
||||
|
||||
|
||||
procedure TLua.DoNewState;
|
||||
begin
|
||||
FState := lua_newstate(@LuaWrapperAlloc, Pointer(Self));
|
||||
if not HasState then
|
||||
raise ELuaInitException.Create('Failed to initialize new state');
|
||||
|
||||
OpenLibraries(AutoOpenLibraries);
|
||||
end;
|
||||
|
||||
|
||||
procedure TLua.DoClose;
|
||||
begin
|
||||
lua_close(FState);
|
||||
FState := nil;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLua.DoRegisterFunction(ACookie: Integer);
|
||||
var
|
||||
name: string;
|
||||
|
||||
begin
|
||||
name := RegisteredFunctions[ACookie].Name;
|
||||
|
||||
lua_pushlightuserdata(State, Self);
|
||||
lua_pushinteger(State, ACookie);
|
||||
|
||||
lua_pushcclosure(State, @LuaWrapperFunction, 2);
|
||||
lua_setglobal(State, NilPAnsiChar(name));
|
||||
end;
|
||||
|
||||
|
||||
function TLua.GetRegisteredFunctionCookie: Integer;
|
||||
begin
|
||||
Inc(FRegisteredFunctionCookie);
|
||||
Result := FRegisteredFunctionCookie;
|
||||
end;
|
||||
|
||||
|
||||
function TLua.RunRegisteredFunction(ACookie: Integer): Integer;
|
||||
var
|
||||
context: ILuaContext;
|
||||
|
||||
begin
|
||||
Result := 0;
|
||||
|
||||
if RegisteredFunctions.ContainsKey(ACookie) then
|
||||
begin
|
||||
context := TLuaContext.Create(State);
|
||||
|
||||
RegisteredFunctions[ACookie].Callback(context);
|
||||
Result := context.Result.Count;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function TLua.GetHasState: Boolean;
|
||||
begin
|
||||
Result := Assigned(FState);
|
||||
end;
|
||||
|
||||
|
||||
function TLua.GetState: lua_State;
|
||||
begin
|
||||
CheckState;
|
||||
Result := FState;
|
||||
end;
|
||||
|
||||
|
||||
function TLua.GetRegisteredFunctions: TLuaRegisteredFunctionDictionary;
|
||||
begin
|
||||
if not Assigned(FRegisteredFunctions) then
|
||||
FRegisteredFunctions := TLuaRegisteredFunctionDictionary.Create;
|
||||
|
||||
Result := FRegisteredFunctions;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLua.SetAutoOpenLibraries(const Value: TLuaLibraries);
|
||||
begin
|
||||
FAutoOpenLibraries := Value;
|
||||
end;
|
||||
|
||||
|
||||
{ TLuaParameters }
|
||||
constructor TLuaParameters.Create(AState: lua_State);
|
||||
begin
|
||||
inherited Create;
|
||||
|
||||
FState := AState;
|
||||
FCount := lua_gettop(FState);
|
||||
end;
|
||||
|
||||
|
||||
function TLuaParameters.PushResultParameters: Integer;
|
||||
begin
|
||||
Result := 0;
|
||||
end;
|
||||
|
||||
|
||||
function TLuaParameters.GetCount: Integer;
|
||||
begin
|
||||
Result := FCount;
|
||||
end;
|
||||
|
||||
|
||||
function TLuaParameters.GetItem(Index: Integer): ILuaParameter;
|
||||
begin
|
||||
Result := TLuaParameter.Create(State, Succ(Index));
|
||||
end;
|
||||
|
||||
|
||||
function TLuaParameters.GetState: lua_State;
|
||||
begin
|
||||
Result := FState;
|
||||
end;
|
||||
|
||||
|
||||
function TLuaParameters.ToString: string;
|
||||
var
|
||||
parameterIndex: Integer;
|
||||
|
||||
begin
|
||||
Result := '';
|
||||
|
||||
for parameterIndex := 0 to Pred(GetCount) do
|
||||
Result := Result + GetItem(parameterIndex).AsString;
|
||||
end;
|
||||
|
||||
|
||||
{ TLuaParameter }
|
||||
constructor TLuaParameter.Create(AState: lua_State; AIndex: Integer);
|
||||
begin
|
||||
inherited Create;
|
||||
|
||||
FState := AState;
|
||||
FIndex := AIndex;
|
||||
end;
|
||||
|
||||
|
||||
function TLuaParameter.GetAsBoolean: Boolean;
|
||||
begin
|
||||
Result := (lua_toboolean(State, GetIndex) <> 0);
|
||||
end;
|
||||
|
||||
|
||||
function TLuaParameter.GetAsInteger: Integer;
|
||||
begin
|
||||
Result := lua_tointeger(State, GetIndex);
|
||||
end;
|
||||
|
||||
|
||||
function TLuaParameter.GetAsNumber: Double;
|
||||
begin
|
||||
Result := lua_tonumber(State, GetIndex);
|
||||
end;
|
||||
|
||||
|
||||
function TLuaParameter.GetAsUserData: Pointer;
|
||||
begin
|
||||
Result := lua_touserdata(State, GetIndex);
|
||||
end;
|
||||
|
||||
|
||||
function TLuaParameter.GetAsString: string;
|
||||
begin
|
||||
Result := string(lua_tostring(State, GetIndex));
|
||||
end;
|
||||
|
||||
|
||||
function TLuaParameter.GetDataType: TLuaDataType;
|
||||
begin
|
||||
case lua_type(State, GetIndex) of
|
||||
LUA_TNIL: Result := LuaNil;
|
||||
LUA_TNUMBER: Result := LuaNumber;
|
||||
LUA_TBOOLEAN: Result := LuaBoolean;
|
||||
LUA_TSTRING: Result := LuaString;
|
||||
LUA_TTABLE: Result := LuaTable;
|
||||
LUA_TFUNCTION: Result := LuaCFunction;
|
||||
LUA_TUSERDATA: Result := LuaUserData;
|
||||
LUA_TTHREAD: Result := LuaThread;
|
||||
LUA_TLIGHTUSERDATA: Result := LuaLightUserData;
|
||||
else
|
||||
Result := LuaNone;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function TLuaParameter.GetIndex: Integer;
|
||||
begin
|
||||
Result := FIndex;
|
||||
end;
|
||||
|
||||
|
||||
{ TLuaContext }
|
||||
constructor TLuaContext.Create(AState: lua_State);
|
||||
begin
|
||||
inherited Create;
|
||||
|
||||
FParameters := TLuaParameters.Create(AState);
|
||||
FResult := TLuaResult.Create(AState);
|
||||
end;
|
||||
|
||||
|
||||
function TLuaContext.GetParameters: ILuaParameters;
|
||||
begin
|
||||
Result := FParameters;
|
||||
end;
|
||||
|
||||
|
||||
function TLuaContext.GetResult: ILuaResult;
|
||||
begin
|
||||
Result := FResult;
|
||||
end;
|
||||
|
||||
|
||||
{ TLuaResult }
|
||||
constructor TLuaResult.Create(AState: lua_State);
|
||||
begin
|
||||
inherited Create;
|
||||
|
||||
FState := AState;
|
||||
end;
|
||||
|
||||
|
||||
function TLuaResult.GetCount: Integer;
|
||||
begin
|
||||
Result := FCount;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLuaResult.Push(ABoolean: Boolean);
|
||||
begin
|
||||
lua_pushboolean(State, IfThen(ABoolean, 1, 0));
|
||||
Pushed;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLuaResult.Push(AInteger: Integer);
|
||||
begin
|
||||
lua_pushinteger(State, AInteger);
|
||||
Pushed;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLuaResult.Push(ANumber: Double);
|
||||
begin
|
||||
lua_pushnumber(State, ANumber);
|
||||
Pushed;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLuaResult.Push(AUserData: Pointer);
|
||||
begin
|
||||
lua_pushlightuserdata(State, AUserData);
|
||||
Pushed;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLuaResult.Push(const AString: string);
|
||||
begin
|
||||
lua_pushstring(State, NilPAnsiChar(AString));
|
||||
Pushed;
|
||||
end;
|
||||
|
||||
|
||||
procedure TLuaResult.Pushed;
|
||||
begin
|
||||
Inc(FCount);
|
||||
end;
|
||||
|
||||
|
||||
end.
|
650
Lua.pas
Normal file
650
Lua.pas
Normal file
@ -0,0 +1,650 @@
|
||||
{
|
||||
Header for Lua 5.2.1 Binaries DLL
|
||||
http://luabinaries.sourceforge.net/
|
||||
|
||||
Delphi conversion by M. van Renswoude, April 2014:
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
}
|
||||
unit Lua;
|
||||
|
||||
interface
|
||||
uses
|
||||
System.SysUtils;
|
||||
|
||||
|
||||
const
|
||||
LUA_VERSION_MAJOR = '5';
|
||||
LUA_VERSION_MINOR = '2';
|
||||
LUA_VERSION_NUM = 502;
|
||||
LUA_VERSION_RELEASE = '1';
|
||||
|
||||
LUA_VERSION_ = 'Lua ' + LUA_VERSION_MAJOR + '.' + LUA_VERSION_MINOR;
|
||||
LUA_RELEASE = LUA_VERSION_ + '.' + LUA_VERSION_RELEASE;
|
||||
LUA_COPYRIGHT = LUA_RELEASE + ' Copyright (C) 1994-2012 Lua.org, PUC-Rio';
|
||||
LUA_AUTHORS = 'R. Ierusalimschy, L. H. de Figueiredo, W. Celes';
|
||||
|
||||
|
||||
{ mark for precompiled code ('<esc>Lua') }
|
||||
LUA_SIGNATURE = #33'Lua';
|
||||
|
||||
{ option for multiple returns in 'lua_pcall' and 'lua_call' }
|
||||
LUA_MULTRET = -1;
|
||||
|
||||
{ reserve some space for error handling }
|
||||
LUAI_MAXSTACK = 1000000;
|
||||
LUAI_FIRSTPSEUDOIDX = (-LUAI_MAXSTACK - 1000);
|
||||
|
||||
{ pseudo-indices }
|
||||
LUA_REGISTRYINDEX = LUAI_FIRSTPSEUDOIDX;
|
||||
|
||||
function lua_upvalueindex(idx: Integer): Integer; inline;
|
||||
|
||||
const
|
||||
{ thread status }
|
||||
LUA_OK = 0;
|
||||
LUA_YIELD = 1;
|
||||
LUA_ERRRUN = 2;
|
||||
LUA_ERRSYNTAX = 3;
|
||||
LUA_ERRMEM = 4;
|
||||
LUA_ERRGCMM = 5;
|
||||
LUA_ERRERR = 6;
|
||||
|
||||
|
||||
type
|
||||
size_t = Cardinal;
|
||||
psize_t = ^size_t;
|
||||
|
||||
lua_State = type Pointer;
|
||||
lua_CFunction = function(L: lua_State): Integer; cdecl;
|
||||
|
||||
{ functions that read/write blocks when loading/dumping Lua chunks }
|
||||
lua_Reader = function(L: lua_State; ud: Pointer; var sz: size_t): PAnsiChar; cdecl;
|
||||
lua_Writer = function(L: lua_State; p: Pointer; sz: size_t; ud: Pointer): Integer; cdecl;
|
||||
|
||||
{ prototype for memory-allocation functions }
|
||||
lua_Alloc = function(ud, ptr: Pointer; osize, nsize: size_t): Pointer; cdecl;
|
||||
|
||||
const
|
||||
{ basic types }
|
||||
LUA_TNONE = (-1);
|
||||
|
||||
LUA_TNIL = 0;
|
||||
LUA_TBOOLEAN = 1;
|
||||
LUA_TLIGHTUSERDATA = 2;
|
||||
LUA_TNUMBER = 3;
|
||||
LUA_TSTRING = 4;
|
||||
LUA_TTABLE = 5;
|
||||
LUA_TFUNCTION = 6;
|
||||
LUA_TUSERDATA = 7;
|
||||
LUA_TTHREAD = 8;
|
||||
|
||||
LUA_NUMTAGS = 9;
|
||||
|
||||
{ minimum Lua stack available to a C function }
|
||||
LUA_MINSTACK = 20;
|
||||
|
||||
|
||||
{ predefined values in the registry }
|
||||
LUA_RIDX_MAINTHREAD = 1;
|
||||
LUA_RIDX_GLOBALS = 2;
|
||||
LUA_RIDX_LAST = LUA_RIDX_GLOBALS;
|
||||
|
||||
|
||||
type
|
||||
{ type of numbers in Lua }
|
||||
lua_Number = type Double;
|
||||
|
||||
{ type for integer functions }
|
||||
lua_Integer = type Integer;
|
||||
|
||||
{ unsigned integer type }
|
||||
lua_Unsigned = type Cardinal;
|
||||
|
||||
|
||||
var
|
||||
{ state manipulation }
|
||||
lua_newstate: function(f: lua_Alloc; ud: Pointer): lua_State; cdecl;
|
||||
lua_close: procedure(L: lua_State); cdecl;
|
||||
lua_newthread: function(L: lua_State): lua_State; cdecl;
|
||||
|
||||
lua_atpanic: function(L: lua_State; panicf: lua_CFunction): lua_CFunction; cdecl;
|
||||
lua_version: function(L: lua_State): lua_Number; cdecl;
|
||||
|
||||
{ basic stack manipulation }
|
||||
lua_absindex: function(L: lua_State; idx: Integer): Integer; cdecl;
|
||||
lua_gettop: function(L: lua_State): Integer; cdecl;
|
||||
|
||||
lua_settop: procedure(L: lua_State; idx: Integer); cdecl;
|
||||
lua_pushvalue: procedure(L: lua_State; idx: Integer); cdecl;
|
||||
lua_remove: procedure(L: lua_State; idx: Integer); cdecl;
|
||||
lua_insert: procedure(L: lua_State; idx: Integer); cdecl;
|
||||
lua_replace: procedure(L: lua_State; idx: Integer); cdecl;
|
||||
lua_copy: procedure(L: lua_State; fromidx, toidx: Integer); cdecl;
|
||||
lua_checkstack: function(L: lua_State; sz: Integer): Integer; cdecl;
|
||||
|
||||
lua_xmove: procedure(from: lua_State; _to: lua_State; n: Integer); cdecl;
|
||||
|
||||
{ access functions (stack -> C) }
|
||||
lua_isnumber: function (L: lua_State; idx: Integer): Integer; cdecl;
|
||||
lua_isstring: function (L: lua_State; idx: Integer): Integer; cdecl;
|
||||
lua_iscfunction: function (L: lua_State; idx: Integer): Integer; cdecl;
|
||||
lua_isuserdata: function (L: lua_State; idx: Integer): Integer; cdecl;
|
||||
lua_type: function (L: lua_State; idx: Integer): Integer; cdecl;
|
||||
lua_typename: function (L: lua_State; tp: Integer): PAnsiChar; cdecl;
|
||||
lua_tonumberx: function (L: lua_State; idx: Integer; isnum: PInteger): lua_Number; cdecl;
|
||||
lua_tointegerx: function (L: lua_State; idx: Integer; isnum: PInteger): lua_Integer; cdecl;
|
||||
lua_tounsignedx: function (L: lua_State; idx: Integer; isnum: PInteger): lua_Unsigned; cdecl;
|
||||
lua_toboolean: function (L: lua_State; idx: Integer): Integer; cdecl;
|
||||
lua_tolstring: function(L: lua_State; idx: Integer; len: psize_t): PAnsiChar; cdecl;
|
||||
lua_rawlen: function (L: lua_State; idx: Integer): size_t; cdecl;
|
||||
lua_tocfunction: function (L: lua_State; idx: Integer): lua_CFunction; cdecl;
|
||||
lua_touserdata: function (L: lua_State; idx: Integer): Pointer; cdecl;
|
||||
lua_tothread: function (L: lua_State; idx: Integer): lua_State; cdecl;
|
||||
lua_topointer: function (L: lua_State; idx: Integer): Pointer; cdecl;
|
||||
|
||||
|
||||
(*
|
||||
/*
|
||||
** Comparison and arithmetic functions
|
||||
*/
|
||||
|
||||
#define LUA_OPADD 0 /* ORDER TM */
|
||||
#define LUA_OPSUB 1
|
||||
#define LUA_OPMUL 2
|
||||
#define LUA_OPDIV 3
|
||||
#define LUA_OPMOD 4
|
||||
#define LUA_OPPOW 5
|
||||
#define LUA_OPUNM 6
|
||||
|
||||
LUA_API void (lua_arith) (lua_State *L, int op);
|
||||
|
||||
#define LUA_OPEQ 0
|
||||
#define LUA_OPLT 1
|
||||
#define LUA_OPLE 2
|
||||
|
||||
LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2);
|
||||
LUA_API int (lua_compare) (lua_State *L, int idx1, int idx2, int op);
|
||||
*)
|
||||
|
||||
{ push functions (C -> stack) }
|
||||
lua_pushnil: procedure(L: lua_State); cdecl;
|
||||
lua_pushnumber: procedure(L: lua_State; n: lua_Number); cdecl;
|
||||
lua_pushinteger: procedure(L: lua_State; n: lua_Integer); cdecl;
|
||||
lua_pushunsigned: procedure(L: lua_State; n: lua_Unsigned); cdecl;
|
||||
lua_pushlstring: function (L: lua_State; s: PAnsiChar; l_: size_t): PAnsiChar; cdecl;
|
||||
lua_pushstring: function (L: lua_State; s: PAnsiChar): PAnsiChar; cdecl;
|
||||
lua_pushvfstring: function (L: lua_State; fmt: PAnsiChar; argp: array of const): PAnsiChar; cdecl;
|
||||
lua_pushfstring: function (L: lua_State; fmt: PAnsiChar): PAnsiChar; cdecl; {$IFDEF FPC}varargs;{$ENDIF}
|
||||
lua_pushcclosure: procedure(L: lua_State; fn: lua_CFunction; n: Integer); cdecl;
|
||||
lua_pushboolean: procedure(L: lua_State; b: Integer); cdecl;
|
||||
lua_pushlightuserdata: procedure(L: lua_State; p: Pointer); cdecl;
|
||||
lua_pushthread: function (L: lua_State): Integer; cdecl;
|
||||
|
||||
{ get functions (Lua -> stack) }
|
||||
lua_getglobal: procedure(L: lua_State; value: PAnsiChar); cdecl;
|
||||
(*
|
||||
LUA_API void (lua_gettable) (lua_State *L, int idx);
|
||||
LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k);
|
||||
LUA_API void (lua_rawget) (lua_State *L, int idx);
|
||||
*)
|
||||
lua_rawgeti: procedure(L: lua_State; idx, n: integer); cdecl;
|
||||
(*
|
||||
LUA_API void (lua_rawgetp) (lua_State *L, int idx, const void *p);
|
||||
LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec);
|
||||
LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);
|
||||
LUA_API int (lua_getmetatable) (lua_State *L, int objindex);
|
||||
LUA_API void (lua_getuservalue) (lua_State *L, int idx);
|
||||
*)
|
||||
|
||||
{ set functions (stack -> Lua) }
|
||||
lua_setglobal: procedure(L: lua_State; value: PAnsiChar); cdecl;
|
||||
(*
|
||||
LUA_API void (lua_settable) (lua_State *L, int idx);
|
||||
LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k);
|
||||
LUA_API void (lua_rawset) (lua_State *L, int idx);
|
||||
LUA_API void (lua_rawseti) (lua_State *L, int idx, int n);
|
||||
LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p);
|
||||
LUA_API int (lua_setmetatable) (lua_State *L, int objindex);
|
||||
LUA_API void (lua_setuservalue) (lua_State *L, int idx);
|
||||
*)
|
||||
|
||||
|
||||
{ 'load' and 'call' functions (load and run Lua code) }
|
||||
lua_callk: procedure(L: lua_State; nargs, nresults, ctx: Integer; k: lua_CFunction); cdecl;
|
||||
lua_getctx: function(L: lua_State; var ctx: Integer): Integer; cdecl;
|
||||
lua_pcallk: function(L: lua_State; nargs, nresults, errfunc, ctx: Integer; k: lua_CFunction): Integer; cdecl;
|
||||
|
||||
lua_load: function(L: lua_State; reader: lua_Reader; dt: Pointer; chunkname, mode: PAnsiChar): Integer; cdecl;
|
||||
lua_dump: function(L: lua_State; writer: lua_Writer; data: Pointer): Integer; cdecl;
|
||||
|
||||
|
||||
procedure lua_call(L: lua_State; nargs, nresults: Integer); inline;
|
||||
function lua_pcall(L: lua_State; nargs, nresults, errfunc: Integer): Integer; inline;
|
||||
|
||||
|
||||
(*
|
||||
/*
|
||||
** coroutine functions
|
||||
*/
|
||||
LUA_API int (lua_yieldk) (lua_State *L, int nresults, int ctx,
|
||||
lua_CFunction k);
|
||||
#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL)
|
||||
LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg);
|
||||
LUA_API int (lua_status) (lua_State *L);
|
||||
|
||||
/*
|
||||
** garbage-collection function and options
|
||||
*/
|
||||
|
||||
#define LUA_GCSTOP 0
|
||||
#define LUA_GCRESTART 1
|
||||
#define LUA_GCCOLLECT 2
|
||||
#define LUA_GCCOUNT 3
|
||||
#define LUA_GCCOUNTB 4
|
||||
#define LUA_GCSTEP 5
|
||||
#define LUA_GCSETPAUSE 6
|
||||
#define LUA_GCSETSTEPMUL 7
|
||||
#define LUA_GCSETMAJORINC 8
|
||||
#define LUA_GCISRUNNING 9
|
||||
#define LUA_GCGEN 10
|
||||
#define LUA_GCINC 11
|
||||
|
||||
LUA_API int (lua_gc) (lua_State *L, int what, int data);
|
||||
|
||||
|
||||
/*
|
||||
** miscellaneous functions
|
||||
*/
|
||||
|
||||
LUA_API int (lua_error) (lua_State *L);
|
||||
|
||||
LUA_API int (lua_next) (lua_State *L, int idx);
|
||||
|
||||
LUA_API void (lua_concat) (lua_State *L, int n);
|
||||
LUA_API void (lua_len) (lua_State *L, int idx);
|
||||
|
||||
LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);
|
||||
LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud);
|
||||
*)
|
||||
|
||||
|
||||
{ some useful macros }
|
||||
function lua_tonumber(L: lua_State; idx: Integer): lua_Number; inline;
|
||||
function lua_tointeger(L: lua_State; idx: Integer): lua_Integer; inline;
|
||||
function lua_tounsigned(L: lua_State; idx: Integer): lua_Unsigned; inline;
|
||||
|
||||
(*
|
||||
#define lua_pop(L,n) lua_settop(L, -(n)-1)
|
||||
|
||||
#define lua_newtable(L) lua_createtable(L, 0, 0)
|
||||
|
||||
#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
|
||||
*)
|
||||
|
||||
procedure lua_pushcfunction(L: lua_State; f: lua_CFunction); inline;
|
||||
|
||||
(*
|
||||
#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION)
|
||||
#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE)
|
||||
#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA)
|
||||
#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL)
|
||||
#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN)
|
||||
#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD)
|
||||
#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE)
|
||||
#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0)
|
||||
|
||||
#define lua_pushliteral(L, s) \
|
||||
lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)
|
||||
*)
|
||||
|
||||
procedure lua_pushglobaltable(L: lua_State); inline;
|
||||
function lua_tostring(L: lua_State; idx: Integer): PAnsiChar; inline;
|
||||
|
||||
(*
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** {======================================================================
|
||||
** Debug API
|
||||
** =======================================================================
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
** Event codes
|
||||
*/
|
||||
#define LUA_HOOKCALL 0
|
||||
#define LUA_HOOKRET 1
|
||||
#define LUA_HOOKLINE 2
|
||||
#define LUA_HOOKCOUNT 3
|
||||
#define LUA_HOOKTAILCALL 4
|
||||
|
||||
|
||||
/*
|
||||
** Event masks
|
||||
*/
|
||||
#define LUA_MASKCALL (1 << LUA_HOOKCALL)
|
||||
#define LUA_MASKRET (1 << LUA_HOOKRET)
|
||||
#define LUA_MASKLINE (1 << LUA_HOOKLINE)
|
||||
#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT)
|
||||
|
||||
|
||||
/* Functions to be called by the debugger in specific events */
|
||||
typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
|
||||
*)
|
||||
|
||||
const
|
||||
LUA_IDSIZE = 60;
|
||||
|
||||
type
|
||||
lua_Debug = record
|
||||
event: Integer;
|
||||
name: PAnsiChar;
|
||||
namewhat: PAnsiChar; // 'global', 'local', 'field', 'method'
|
||||
what: PAnsiChar; // 'Lua', 'C', 'main', 'tail'
|
||||
source: PAnsiChar;
|
||||
currentline: Integer;
|
||||
linedefined: Integer;
|
||||
lastlinedefined: Integer;
|
||||
nups: Byte;
|
||||
nparams: Byte;
|
||||
isvararg: Byte;
|
||||
istailcall: Byte;
|
||||
short_src: array[0..LUA_IDSIZE - 1] of AnsiChar;
|
||||
//struct CallInfo *i_ci; /* active function */
|
||||
end;
|
||||
|
||||
|
||||
var
|
||||
lua_getstack: function(L: lua_State; level: Integer; var ar: lua_Debug): Integer; cdecl;
|
||||
lua_getinfo: function(L: lua_State; what: PAnsiChar; var ar: lua_Debug): Integer; cdecl;
|
||||
|
||||
(*
|
||||
LUA_API const char *(lua_getlocal) (lua_State *L, const lua_Debug *ar, int n);
|
||||
LUA_API const char *(lua_setlocal) (lua_State *L, const lua_Debug *ar, int n);
|
||||
LUA_API const char *(lua_getupvalue) (lua_State *L, int funcindex, int n);
|
||||
LUA_API const char *(lua_setupvalue) (lua_State *L, int funcindex, int n);
|
||||
|
||||
LUA_API void *(lua_upvalueid) (lua_State *L, int fidx, int n);
|
||||
LUA_API void (lua_upvaluejoin) (lua_State *L, int fidx1, int n1,
|
||||
int fidx2, int n2);
|
||||
|
||||
LUA_API int (lua_sethook) (lua_State *L, lua_Hook func, int mask, int count);
|
||||
LUA_API lua_Hook (lua_gethook) (lua_State *L);
|
||||
LUA_API int (lua_gethookmask) (lua_State *L);
|
||||
LUA_API int (lua_gethookcount) (lua_State *L);
|
||||
/* }====================================================================== */
|
||||
|
||||
#endif
|
||||
*)
|
||||
|
||||
|
||||
const
|
||||
LUA_COLIBNAME = 'coroutine';
|
||||
LUA_TABLIBNAME = 'table';
|
||||
LUA_IOLIBNAME = 'io';
|
||||
LUA_OSLIBNAME = 'os';
|
||||
LUA_STRLIBNAME = 'string';
|
||||
LUA_BITLIBNAME = 'bit32';
|
||||
LUA_MATHLIBNAME = 'math';
|
||||
LUA_DBLIBNAME = 'debug';
|
||||
LUA_LOADLIBNAME = 'package';
|
||||
|
||||
|
||||
var
|
||||
{ lualib }
|
||||
luaopen_base: function(L: lua_State): Integer; cdecl;
|
||||
luaopen_coroutine: function(L: lua_State): Integer; cdecl;
|
||||
luaopen_table: function(L: lua_State): Integer; cdecl;
|
||||
luaopen_io: function(L: lua_State): Integer; cdecl;
|
||||
luaopen_os: function(L: lua_State): Integer; cdecl;
|
||||
luaopen_string: function(L: lua_State): Integer; cdecl;
|
||||
luaopen_bit32: function(L: lua_State): Integer; cdecl;
|
||||
luaopen_math: function(L: lua_State): Integer; cdecl;
|
||||
luaopen_debug: function(L: lua_State): Integer; cdecl;
|
||||
luaopen_package: function(L: lua_State): Integer; cdecl;
|
||||
|
||||
{ open all previous libraries }
|
||||
luaL_openlibs: procedure(L: lua_State); cdecl;
|
||||
|
||||
|
||||
type
|
||||
luaL_Reg = record
|
||||
name: PAnsiChar;
|
||||
func: lua_CFunction;
|
||||
end;
|
||||
PluaL_Reg = ^luaL_Reg;
|
||||
|
||||
var
|
||||
luaL_setfuncs: procedure(L: lua_State; luaL_Reg: PluaL_Reg; nup: Integer); cdecl;
|
||||
|
||||
|
||||
const
|
||||
DefaultLuaLibName = 'lua' + LUA_VERSION_MAJOR + LUA_VERSION_MINOR + '.dll';
|
||||
|
||||
procedure LoadLuaLib(const AFileName: string = DefaultLuaLibName);
|
||||
procedure UnloadLuaLib;
|
||||
|
||||
function LuaLibLoaded: Boolean;
|
||||
|
||||
function DefaultLuaAlloc(ud, ptr: Pointer; osize, nsize: size_t): Pointer; cdecl;
|
||||
|
||||
|
||||
implementation
|
||||
uses
|
||||
System.Generics.Collections,
|
||||
Winapi.Windows;
|
||||
|
||||
var
|
||||
LuaLibHandle: THandle;
|
||||
LuaFunctions: TList<PPointer>;
|
||||
|
||||
|
||||
function DefaultLuaAlloc(ud, ptr: Pointer; osize, nsize: size_t): Pointer;
|
||||
begin
|
||||
if (nsize = 0) then
|
||||
begin
|
||||
FreeMemory(ptr);
|
||||
Result := nil;
|
||||
end else
|
||||
Result := ReallocMemory(ptr, nsize);
|
||||
end;
|
||||
|
||||
|
||||
procedure LoadLuaLib(const AFileName: string = DefaultLuaLibName);
|
||||
|
||||
procedure Load(var AVariable: Pointer; const AName: string);
|
||||
begin
|
||||
AVariable := GetProcAddress(LuaLibHandle, PChar(AName));
|
||||
LuaFunctions.Add(@AVariable);
|
||||
end;
|
||||
|
||||
|
||||
begin
|
||||
UnloadLuaLib;
|
||||
|
||||
LuaLibHandle := SafeLoadLibrary(AFileName);
|
||||
if LuaLibHandle = 0 then
|
||||
RaiseLastOSError;
|
||||
|
||||
if not Assigned(LuaFunctions) then
|
||||
LuaFunctions := TList<PPointer>.Create();
|
||||
|
||||
Load(@lua_newstate, 'lua_newstate');
|
||||
Load(@lua_close, 'lua_close');
|
||||
Load(@lua_newthread, 'lua_newthread');
|
||||
|
||||
Load(@lua_atpanic, 'lua_atpanic');
|
||||
Load(@lua_version, 'lua_version');
|
||||
|
||||
Load(@lua_absindex, 'lua_absindex');
|
||||
Load(@lua_gettop, 'lua_gettop');
|
||||
Load(@lua_settop, 'lua_settop');
|
||||
Load(@lua_pushvalue, 'lua_pushvalue');
|
||||
Load(@lua_remove, 'lua_remove');
|
||||
Load(@lua_insert, 'lua_insert');
|
||||
Load(@lua_replace, 'lua_replace');
|
||||
Load(@lua_copy, 'lua_copy');
|
||||
Load(@lua_checkstack, 'lua_checkstack');
|
||||
Load(@lua_xmove, 'lua_xmove');
|
||||
|
||||
Load(@lua_isnumber, 'lua_isnumber');
|
||||
Load(@lua_isstring, 'lua_isstring');
|
||||
Load(@lua_iscfunction, 'lua_iscfunction');
|
||||
Load(@lua_isuserdata, 'lua_isuserdata');
|
||||
Load(@lua_type, 'lua_type');
|
||||
Load(@lua_typename, 'lua_typename');
|
||||
Load(@lua_tonumberx, 'lua_tonumberx');
|
||||
Load(@lua_tointegerx, 'lua_tointegerx');
|
||||
Load(@lua_tounsignedx, 'lua_tounsignedx');
|
||||
Load(@lua_toboolean, 'lua_toboolean');
|
||||
Load(@lua_tolstring, 'lua_tolstring');
|
||||
Load(@lua_rawlen, 'lua_rawlen');
|
||||
Load(@lua_tocfunction, 'lua_tocfunction');
|
||||
Load(@lua_touserdata, 'lua_touserdata');
|
||||
Load(@lua_tothread, 'lua_tothread');
|
||||
Load(@lua_topointer, 'lua_topointer');
|
||||
|
||||
Load(@lua_pushnil, 'lua_pushnil');
|
||||
Load(@lua_pushnumber, 'lua_pushnumber');
|
||||
Load(@lua_pushinteger, 'lua_pushinteger');
|
||||
Load(@lua_pushunsigned, 'lua_pushunsigned');
|
||||
Load(@lua_pushlstring, 'lua_pushlstring');
|
||||
Load(@lua_pushstring, 'lua_pushstring');
|
||||
Load(@lua_pushvfstring, 'lua_pushvfstring');
|
||||
Load(@lua_pushfstring, 'lua_pushfstring');
|
||||
Load(@lua_pushcclosure, 'lua_pushcclosure');
|
||||
Load(@lua_pushboolean, 'lua_pushboolean');
|
||||
Load(@lua_pushlightuserdata, 'lua_pushlightuserdata');
|
||||
Load(@lua_pushthread, 'lua_pushthread');
|
||||
|
||||
Load(@lua_getglobal, 'lua_getglobal');
|
||||
|
||||
Load(@lua_rawgeti, 'lua_rawgeti');
|
||||
Load(@lua_setglobal, 'lua_setglobal');
|
||||
|
||||
Load(@lua_callk, 'lua_callk');
|
||||
Load(@lua_getctx, 'lua_getctx');
|
||||
Load(@lua_pcallk, 'lua_pcallk');
|
||||
|
||||
Load(@lua_load, 'lua_load');
|
||||
Load(@lua_dump, 'lua_dump');
|
||||
|
||||
Load(@lua_getstack, 'lua_getstack');
|
||||
Load(@lua_getinfo, 'lua_getinfo');
|
||||
|
||||
|
||||
Load(@luaopen_base, 'luaopen_base');
|
||||
Load(@luaopen_coroutine, 'luaopen_coroutine');
|
||||
Load(@luaopen_table, 'luaopen_table');
|
||||
Load(@luaopen_io, 'luaopen_io');
|
||||
Load(@luaopen_os, 'luaopen_os');
|
||||
Load(@luaopen_string, 'luaopen_string');
|
||||
Load(@luaopen_bit32, 'luaopen_bit32');
|
||||
Load(@luaopen_math, 'luaopen_math');
|
||||
Load(@luaopen_debug, 'luaopen_debug');
|
||||
Load(@luaopen_package, 'luaopen_package');
|
||||
|
||||
Load(@luaL_openlibs, 'luaL_openlibs');
|
||||
|
||||
Load(@luaL_setfuncs, 'luaL_setfuncs');
|
||||
end;
|
||||
|
||||
|
||||
procedure UnloadLuaLib;
|
||||
var
|
||||
variable: PPointer;
|
||||
|
||||
begin
|
||||
if Assigned(LuaFunctions) then
|
||||
begin
|
||||
for variable in LuaFunctions do
|
||||
variable^ := nil;
|
||||
end;
|
||||
|
||||
if LuaLibLoaded then
|
||||
begin
|
||||
FreeLibrary(LuaLibHandle);
|
||||
LuaLibHandle := 0;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function LuaLibLoaded: Boolean;
|
||||
begin
|
||||
Result := (LuaLibHandle <> 0);
|
||||
end;
|
||||
|
||||
|
||||
{ Macros }
|
||||
function lua_upvalueindex(idx: Integer): Integer;
|
||||
begin
|
||||
Result := (LUA_REGISTRYINDEX - idx);
|
||||
end;
|
||||
|
||||
procedure lua_call(L: lua_State; nargs, nresults: Integer);
|
||||
begin
|
||||
lua_callk(L, nargs, nresults, 0, nil);
|
||||
end;
|
||||
|
||||
function lua_pcall(L: lua_State; nargs, nresults, errfunc: Integer): Integer;
|
||||
begin
|
||||
Result := lua_pcallk(L, nargs, nresults, errfunc, 0, nil);
|
||||
end;
|
||||
|
||||
function lua_tonumber(L: lua_State; idx: Integer): lua_Number;
|
||||
begin
|
||||
Result := lua_tonumberx(L, idx, nil);
|
||||
end;
|
||||
|
||||
function lua_tointeger(L: lua_State; idx: Integer): lua_Integer;
|
||||
begin
|
||||
Result := lua_tointegerx(L, idx, nil);
|
||||
end;
|
||||
|
||||
function lua_tounsigned(L: lua_State; idx: Integer): lua_Unsigned;
|
||||
begin
|
||||
Result := lua_tounsignedx(L, idx, nil);
|
||||
end;
|
||||
|
||||
procedure lua_pushcfunction(L: lua_State; f: lua_CFunction);
|
||||
begin
|
||||
lua_pushcclosure(L, f, 0);
|
||||
end;
|
||||
|
||||
procedure lua_pushglobaltable(L: lua_State);
|
||||
begin
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS);
|
||||
end;
|
||||
|
||||
function lua_tostring(L: lua_State; idx: Integer): PAnsiChar;
|
||||
begin
|
||||
Result := lua_tolstring(L, idx, nil);
|
||||
end;
|
||||
|
||||
|
||||
initialization
|
||||
finalization
|
||||
UnloadLuaLib;
|
||||
FreeAndNil(LuaFunctions);
|
||||
|
||||
end.
|
212
LuaBinaries/include/lauxlib.h
Normal file
212
LuaBinaries/include/lauxlib.h
Normal file
@ -0,0 +1,212 @@
|
||||
/*
|
||||
** $Id: lauxlib.h,v 1.120 2011/11/29 15:55:08 roberto Exp $
|
||||
** Auxiliary functions for building Lua libraries
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
|
||||
#ifndef lauxlib_h
|
||||
#define lauxlib_h
|
||||
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
|
||||
|
||||
/* extra error code for `luaL_load' */
|
||||
#define LUA_ERRFILE (LUA_ERRERR+1)
|
||||
|
||||
|
||||
typedef struct luaL_Reg {
|
||||
const char *name;
|
||||
lua_CFunction func;
|
||||
} luaL_Reg;
|
||||
|
||||
|
||||
LUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver);
|
||||
#define luaL_checkversion(L) luaL_checkversion_(L, LUA_VERSION_NUM)
|
||||
|
||||
LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);
|
||||
LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);
|
||||
LUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len);
|
||||
LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg);
|
||||
LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg,
|
||||
size_t *l);
|
||||
LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg,
|
||||
const char *def, size_t *l);
|
||||
LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg);
|
||||
LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def);
|
||||
|
||||
LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);
|
||||
LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,
|
||||
lua_Integer def);
|
||||
LUALIB_API lua_Unsigned (luaL_checkunsigned) (lua_State *L, int numArg);
|
||||
LUALIB_API lua_Unsigned (luaL_optunsigned) (lua_State *L, int numArg,
|
||||
lua_Unsigned def);
|
||||
|
||||
LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);
|
||||
LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);
|
||||
LUALIB_API void (luaL_checkany) (lua_State *L, int narg);
|
||||
|
||||
LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname);
|
||||
LUALIB_API void (luaL_setmetatable) (lua_State *L, const char *tname);
|
||||
LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname);
|
||||
LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);
|
||||
|
||||
LUALIB_API void (luaL_where) (lua_State *L, int lvl);
|
||||
LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);
|
||||
|
||||
LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,
|
||||
const char *const lst[]);
|
||||
|
||||
LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname);
|
||||
LUALIB_API int (luaL_execresult) (lua_State *L, int stat);
|
||||
|
||||
/* pre-defined references */
|
||||
#define LUA_NOREF (-2)
|
||||
#define LUA_REFNIL (-1)
|
||||
|
||||
LUALIB_API int (luaL_ref) (lua_State *L, int t);
|
||||
LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
|
||||
|
||||
LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename,
|
||||
const char *mode);
|
||||
|
||||
#define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL)
|
||||
|
||||
LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz,
|
||||
const char *name, const char *mode);
|
||||
LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);
|
||||
|
||||
LUALIB_API lua_State *(luaL_newstate) (void);
|
||||
|
||||
LUALIB_API int (luaL_len) (lua_State *L, int idx);
|
||||
|
||||
LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,
|
||||
const char *r);
|
||||
|
||||
LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
|
||||
|
||||
LUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname);
|
||||
|
||||
LUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1,
|
||||
const char *msg, int level);
|
||||
|
||||
LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname,
|
||||
lua_CFunction openf, int glb);
|
||||
|
||||
/*
|
||||
** ===============================================================
|
||||
** some useful macros
|
||||
** ===============================================================
|
||||
*/
|
||||
|
||||
|
||||
#define luaL_newlibtable(L,l) \
|
||||
lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
|
||||
|
||||
#define luaL_newlib(L,l) (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
|
||||
|
||||
#define luaL_argcheck(L, cond,numarg,extramsg) \
|
||||
((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))
|
||||
#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL))
|
||||
#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL))
|
||||
#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n)))
|
||||
#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d)))
|
||||
#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n)))
|
||||
#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d)))
|
||||
|
||||
#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i)))
|
||||
|
||||
#define luaL_dofile(L, fn) \
|
||||
(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
|
||||
|
||||
#define luaL_dostring(L, s) \
|
||||
(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))
|
||||
|
||||
#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n)))
|
||||
|
||||
#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
|
||||
|
||||
#define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL)
|
||||
|
||||
|
||||
/*
|
||||
** {======================================================
|
||||
** Generic Buffer manipulation
|
||||
** =======================================================
|
||||
*/
|
||||
|
||||
typedef struct luaL_Buffer {
|
||||
char *b; /* buffer address */
|
||||
size_t size; /* buffer size */
|
||||
size_t n; /* number of characters in buffer */
|
||||
lua_State *L;
|
||||
char initb[LUAL_BUFFERSIZE]; /* initial buffer */
|
||||
} luaL_Buffer;
|
||||
|
||||
|
||||
#define luaL_addchar(B,c) \
|
||||
((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), \
|
||||
((B)->b[(B)->n++] = (c)))
|
||||
|
||||
#define luaL_addsize(B,s) ((B)->n += (s))
|
||||
|
||||
LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);
|
||||
LUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz);
|
||||
LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);
|
||||
LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);
|
||||
LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);
|
||||
LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
|
||||
LUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz);
|
||||
LUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz);
|
||||
|
||||
#define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE)
|
||||
|
||||
/* }====================================================== */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** {======================================================
|
||||
** File handles for IO library
|
||||
** =======================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and
|
||||
** initial structure 'luaL_Stream' (it may contain other fields
|
||||
** after that initial structure).
|
||||
*/
|
||||
|
||||
#define LUA_FILEHANDLE "FILE*"
|
||||
|
||||
|
||||
typedef struct luaL_Stream {
|
||||
FILE *f; /* stream (NULL for incompletely created streams) */
|
||||
lua_CFunction closef; /* to close stream (NULL for closed streams) */
|
||||
} luaL_Stream;
|
||||
|
||||
/* }====================================================== */
|
||||
|
||||
|
||||
|
||||
/* compatibility with old module system */
|
||||
#if defined(LUA_COMPAT_MODULE)
|
||||
|
||||
LUALIB_API void (luaL_pushmodule) (lua_State *L, const char *modname,
|
||||
int sizehint);
|
||||
LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname,
|
||||
const luaL_Reg *l, int nup);
|
||||
|
||||
#define luaL_register(L,n,l) (luaL_openlib(L,(n),(l),0))
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
439
LuaBinaries/include/lua.h
Normal file
439
LuaBinaries/include/lua.h
Normal file
@ -0,0 +1,439 @@
|
||||
/*
|
||||
** $Id: lua.h,v 1.283 2012/04/20 13:18:26 roberto Exp $
|
||||
** Lua - A Scripting Language
|
||||
** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
|
||||
** See Copyright Notice at the end of this file
|
||||
*/
|
||||
|
||||
|
||||
#ifndef lua_h
|
||||
#define lua_h
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
#include "luaconf.h"
|
||||
|
||||
|
||||
#define LUA_VERSION_MAJOR "5"
|
||||
#define LUA_VERSION_MINOR "2"
|
||||
#define LUA_VERSION_NUM 502
|
||||
#define LUA_VERSION_RELEASE "1"
|
||||
|
||||
#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR
|
||||
#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE
|
||||
#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2012 Lua.org, PUC-Rio"
|
||||
#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes"
|
||||
|
||||
|
||||
/* mark for precompiled code ('<esc>Lua') */
|
||||
#define LUA_SIGNATURE "\033Lua"
|
||||
|
||||
/* option for multiple returns in 'lua_pcall' and 'lua_call' */
|
||||
#define LUA_MULTRET (-1)
|
||||
|
||||
|
||||
/*
|
||||
** pseudo-indices
|
||||
*/
|
||||
#define LUA_REGISTRYINDEX LUAI_FIRSTPSEUDOIDX
|
||||
#define lua_upvalueindex(i) (LUA_REGISTRYINDEX - (i))
|
||||
|
||||
|
||||
/* thread status */
|
||||
#define LUA_OK 0
|
||||
#define LUA_YIELD 1
|
||||
#define LUA_ERRRUN 2
|
||||
#define LUA_ERRSYNTAX 3
|
||||
#define LUA_ERRMEM 4
|
||||
#define LUA_ERRGCMM 5
|
||||
#define LUA_ERRERR 6
|
||||
|
||||
|
||||
typedef struct lua_State lua_State;
|
||||
|
||||
typedef int (*lua_CFunction) (lua_State *L);
|
||||
|
||||
|
||||
/*
|
||||
** functions that read/write blocks when loading/dumping Lua chunks
|
||||
*/
|
||||
typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);
|
||||
|
||||
typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud);
|
||||
|
||||
|
||||
/*
|
||||
** prototype for memory-allocation functions
|
||||
*/
|
||||
typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);
|
||||
|
||||
|
||||
/*
|
||||
** basic types
|
||||
*/
|
||||
#define LUA_TNONE (-1)
|
||||
|
||||
#define LUA_TNIL 0
|
||||
#define LUA_TBOOLEAN 1
|
||||
#define LUA_TLIGHTUSERDATA 2
|
||||
#define LUA_TNUMBER 3
|
||||
#define LUA_TSTRING 4
|
||||
#define LUA_TTABLE 5
|
||||
#define LUA_TFUNCTION 6
|
||||
#define LUA_TUSERDATA 7
|
||||
#define LUA_TTHREAD 8
|
||||
|
||||
#define LUA_NUMTAGS 9
|
||||
|
||||
|
||||
|
||||
/* minimum Lua stack available to a C function */
|
||||
#define LUA_MINSTACK 20
|
||||
|
||||
|
||||
/* predefined values in the registry */
|
||||
#define LUA_RIDX_MAINTHREAD 1
|
||||
#define LUA_RIDX_GLOBALS 2
|
||||
#define LUA_RIDX_LAST LUA_RIDX_GLOBALS
|
||||
|
||||
|
||||
/* type of numbers in Lua */
|
||||
typedef LUA_NUMBER lua_Number;
|
||||
|
||||
|
||||
/* type for integer functions */
|
||||
typedef LUA_INTEGER lua_Integer;
|
||||
|
||||
/* unsigned integer type */
|
||||
typedef LUA_UNSIGNED lua_Unsigned;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** generic extra include file
|
||||
*/
|
||||
#if defined(LUA_USER_H)
|
||||
#include LUA_USER_H
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** state manipulation
|
||||
*/
|
||||
LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);
|
||||
LUA_API void (lua_close) (lua_State *L);
|
||||
LUA_API lua_State *(lua_newthread) (lua_State *L);
|
||||
|
||||
LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);
|
||||
|
||||
|
||||
LUA_API const lua_Number *(lua_version) (lua_State *L);
|
||||
|
||||
|
||||
/*
|
||||
** basic stack manipulation
|
||||
*/
|
||||
LUA_API int (lua_absindex) (lua_State *L, int idx);
|
||||
LUA_API int (lua_gettop) (lua_State *L);
|
||||
LUA_API void (lua_settop) (lua_State *L, int idx);
|
||||
LUA_API void (lua_pushvalue) (lua_State *L, int idx);
|
||||
LUA_API void (lua_remove) (lua_State *L, int idx);
|
||||
LUA_API void (lua_insert) (lua_State *L, int idx);
|
||||
LUA_API void (lua_replace) (lua_State *L, int idx);
|
||||
LUA_API void (lua_copy) (lua_State *L, int fromidx, int toidx);
|
||||
LUA_API int (lua_checkstack) (lua_State *L, int sz);
|
||||
|
||||
LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n);
|
||||
|
||||
|
||||
/*
|
||||
** access functions (stack -> C)
|
||||
*/
|
||||
|
||||
LUA_API int (lua_isnumber) (lua_State *L, int idx);
|
||||
LUA_API int (lua_isstring) (lua_State *L, int idx);
|
||||
LUA_API int (lua_iscfunction) (lua_State *L, int idx);
|
||||
LUA_API int (lua_isuserdata) (lua_State *L, int idx);
|
||||
LUA_API int (lua_type) (lua_State *L, int idx);
|
||||
LUA_API const char *(lua_typename) (lua_State *L, int tp);
|
||||
|
||||
LUA_API lua_Number (lua_tonumberx) (lua_State *L, int idx, int *isnum);
|
||||
LUA_API lua_Integer (lua_tointegerx) (lua_State *L, int idx, int *isnum);
|
||||
LUA_API lua_Unsigned (lua_tounsignedx) (lua_State *L, int idx, int *isnum);
|
||||
LUA_API int (lua_toboolean) (lua_State *L, int idx);
|
||||
LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len);
|
||||
LUA_API size_t (lua_rawlen) (lua_State *L, int idx);
|
||||
LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx);
|
||||
LUA_API void *(lua_touserdata) (lua_State *L, int idx);
|
||||
LUA_API lua_State *(lua_tothread) (lua_State *L, int idx);
|
||||
LUA_API const void *(lua_topointer) (lua_State *L, int idx);
|
||||
|
||||
|
||||
/*
|
||||
** Comparison and arithmetic functions
|
||||
*/
|
||||
|
||||
#define LUA_OPADD 0 /* ORDER TM */
|
||||
#define LUA_OPSUB 1
|
||||
#define LUA_OPMUL 2
|
||||
#define LUA_OPDIV 3
|
||||
#define LUA_OPMOD 4
|
||||
#define LUA_OPPOW 5
|
||||
#define LUA_OPUNM 6
|
||||
|
||||
LUA_API void (lua_arith) (lua_State *L, int op);
|
||||
|
||||
#define LUA_OPEQ 0
|
||||
#define LUA_OPLT 1
|
||||
#define LUA_OPLE 2
|
||||
|
||||
LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2);
|
||||
LUA_API int (lua_compare) (lua_State *L, int idx1, int idx2, int op);
|
||||
|
||||
|
||||
/*
|
||||
** push functions (C -> stack)
|
||||
*/
|
||||
LUA_API void (lua_pushnil) (lua_State *L);
|
||||
LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n);
|
||||
LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n);
|
||||
LUA_API void (lua_pushunsigned) (lua_State *L, lua_Unsigned n);
|
||||
LUA_API const char *(lua_pushlstring) (lua_State *L, const char *s, size_t l);
|
||||
LUA_API const char *(lua_pushstring) (lua_State *L, const char *s);
|
||||
LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,
|
||||
va_list argp);
|
||||
LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);
|
||||
LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);
|
||||
LUA_API void (lua_pushboolean) (lua_State *L, int b);
|
||||
LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p);
|
||||
LUA_API int (lua_pushthread) (lua_State *L);
|
||||
|
||||
|
||||
/*
|
||||
** get functions (Lua -> stack)
|
||||
*/
|
||||
LUA_API void (lua_getglobal) (lua_State *L, const char *var);
|
||||
LUA_API void (lua_gettable) (lua_State *L, int idx);
|
||||
LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k);
|
||||
LUA_API void (lua_rawget) (lua_State *L, int idx);
|
||||
LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n);
|
||||
LUA_API void (lua_rawgetp) (lua_State *L, int idx, const void *p);
|
||||
LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec);
|
||||
LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);
|
||||
LUA_API int (lua_getmetatable) (lua_State *L, int objindex);
|
||||
LUA_API void (lua_getuservalue) (lua_State *L, int idx);
|
||||
|
||||
|
||||
/*
|
||||
** set functions (stack -> Lua)
|
||||
*/
|
||||
LUA_API void (lua_setglobal) (lua_State *L, const char *var);
|
||||
LUA_API void (lua_settable) (lua_State *L, int idx);
|
||||
LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k);
|
||||
LUA_API void (lua_rawset) (lua_State *L, int idx);
|
||||
LUA_API void (lua_rawseti) (lua_State *L, int idx, int n);
|
||||
LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p);
|
||||
LUA_API int (lua_setmetatable) (lua_State *L, int objindex);
|
||||
LUA_API void (lua_setuservalue) (lua_State *L, int idx);
|
||||
|
||||
|
||||
/*
|
||||
** 'load' and 'call' functions (load and run Lua code)
|
||||
*/
|
||||
LUA_API void (lua_callk) (lua_State *L, int nargs, int nresults, int ctx,
|
||||
lua_CFunction k);
|
||||
#define lua_call(L,n,r) lua_callk(L, (n), (r), 0, NULL)
|
||||
|
||||
LUA_API int (lua_getctx) (lua_State *L, int *ctx);
|
||||
|
||||
LUA_API int (lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc,
|
||||
int ctx, lua_CFunction k);
|
||||
#define lua_pcall(L,n,r,f) lua_pcallk(L, (n), (r), (f), 0, NULL)
|
||||
|
||||
LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt,
|
||||
const char *chunkname,
|
||||
const char *mode);
|
||||
|
||||
LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data);
|
||||
|
||||
|
||||
/*
|
||||
** coroutine functions
|
||||
*/
|
||||
LUA_API int (lua_yieldk) (lua_State *L, int nresults, int ctx,
|
||||
lua_CFunction k);
|
||||
#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL)
|
||||
LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg);
|
||||
LUA_API int (lua_status) (lua_State *L);
|
||||
|
||||
/*
|
||||
** garbage-collection function and options
|
||||
*/
|
||||
|
||||
#define LUA_GCSTOP 0
|
||||
#define LUA_GCRESTART 1
|
||||
#define LUA_GCCOLLECT 2
|
||||
#define LUA_GCCOUNT 3
|
||||
#define LUA_GCCOUNTB 4
|
||||
#define LUA_GCSTEP 5
|
||||
#define LUA_GCSETPAUSE 6
|
||||
#define LUA_GCSETSTEPMUL 7
|
||||
#define LUA_GCSETMAJORINC 8
|
||||
#define LUA_GCISRUNNING 9
|
||||
#define LUA_GCGEN 10
|
||||
#define LUA_GCINC 11
|
||||
|
||||
LUA_API int (lua_gc) (lua_State *L, int what, int data);
|
||||
|
||||
|
||||
/*
|
||||
** miscellaneous functions
|
||||
*/
|
||||
|
||||
LUA_API int (lua_error) (lua_State *L);
|
||||
|
||||
LUA_API int (lua_next) (lua_State *L, int idx);
|
||||
|
||||
LUA_API void (lua_concat) (lua_State *L, int n);
|
||||
LUA_API void (lua_len) (lua_State *L, int idx);
|
||||
|
||||
LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);
|
||||
LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** ===============================================================
|
||||
** some useful macros
|
||||
** ===============================================================
|
||||
*/
|
||||
|
||||
#define lua_tonumber(L,i) lua_tonumberx(L,i,NULL)
|
||||
#define lua_tointeger(L,i) lua_tointegerx(L,i,NULL)
|
||||
#define lua_tounsigned(L,i) lua_tounsignedx(L,i,NULL)
|
||||
|
||||
#define lua_pop(L,n) lua_settop(L, -(n)-1)
|
||||
|
||||
#define lua_newtable(L) lua_createtable(L, 0, 0)
|
||||
|
||||
#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
|
||||
|
||||
#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0)
|
||||
|
||||
#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION)
|
||||
#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE)
|
||||
#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA)
|
||||
#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL)
|
||||
#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN)
|
||||
#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD)
|
||||
#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE)
|
||||
#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0)
|
||||
|
||||
#define lua_pushliteral(L, s) \
|
||||
lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)
|
||||
|
||||
#define lua_pushglobaltable(L) \
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS)
|
||||
|
||||
#define lua_tostring(L,i) lua_tolstring(L, (i), NULL)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** {======================================================================
|
||||
** Debug API
|
||||
** =======================================================================
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
** Event codes
|
||||
*/
|
||||
#define LUA_HOOKCALL 0
|
||||
#define LUA_HOOKRET 1
|
||||
#define LUA_HOOKLINE 2
|
||||
#define LUA_HOOKCOUNT 3
|
||||
#define LUA_HOOKTAILCALL 4
|
||||
|
||||
|
||||
/*
|
||||
** Event masks
|
||||
*/
|
||||
#define LUA_MASKCALL (1 << LUA_HOOKCALL)
|
||||
#define LUA_MASKRET (1 << LUA_HOOKRET)
|
||||
#define LUA_MASKLINE (1 << LUA_HOOKLINE)
|
||||
#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT)
|
||||
|
||||
typedef struct lua_Debug lua_Debug; /* activation record */
|
||||
|
||||
|
||||
/* Functions to be called by the debugger in specific events */
|
||||
typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
|
||||
|
||||
|
||||
LUA_API int (lua_getstack) (lua_State *L, int level, lua_Debug *ar);
|
||||
LUA_API int (lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar);
|
||||
LUA_API const char *(lua_getlocal) (lua_State *L, const lua_Debug *ar, int n);
|
||||
LUA_API const char *(lua_setlocal) (lua_State *L, const lua_Debug *ar, int n);
|
||||
LUA_API const char *(lua_getupvalue) (lua_State *L, int funcindex, int n);
|
||||
LUA_API const char *(lua_setupvalue) (lua_State *L, int funcindex, int n);
|
||||
|
||||
LUA_API void *(lua_upvalueid) (lua_State *L, int fidx, int n);
|
||||
LUA_API void (lua_upvaluejoin) (lua_State *L, int fidx1, int n1,
|
||||
int fidx2, int n2);
|
||||
|
||||
LUA_API int (lua_sethook) (lua_State *L, lua_Hook func, int mask, int count);
|
||||
LUA_API lua_Hook (lua_gethook) (lua_State *L);
|
||||
LUA_API int (lua_gethookmask) (lua_State *L);
|
||||
LUA_API int (lua_gethookcount) (lua_State *L);
|
||||
|
||||
|
||||
struct lua_Debug {
|
||||
int event;
|
||||
const char *name; /* (n) */
|
||||
const char *namewhat; /* (n) 'global', 'local', 'field', 'method' */
|
||||
const char *what; /* (S) 'Lua', 'C', 'main', 'tail' */
|
||||
const char *source; /* (S) */
|
||||
int currentline; /* (l) */
|
||||
int linedefined; /* (S) */
|
||||
int lastlinedefined; /* (S) */
|
||||
unsigned char nups; /* (u) number of upvalues */
|
||||
unsigned char nparams;/* (u) number of parameters */
|
||||
char isvararg; /* (u) */
|
||||
char istailcall; /* (t) */
|
||||
char short_src[LUA_IDSIZE]; /* (S) */
|
||||
/* private part */
|
||||
struct CallInfo *i_ci; /* active function */
|
||||
};
|
||||
|
||||
/* }====================================================================== */
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Copyright (C) 1994-2012 Lua.org, PUC-Rio.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#endif
|
9
LuaBinaries/include/lua.hpp
Normal file
9
LuaBinaries/include/lua.hpp
Normal file
@ -0,0 +1,9 @@
|
||||
// lua.hpp
|
||||
// Lua header files for C++
|
||||
// <<extern "C">> not supplied automatically because Lua also compiles as C++
|
||||
|
||||
extern "C" {
|
||||
#include "lua.h"
|
||||
#include "lualib.h"
|
||||
#include "lauxlib.h"
|
||||
}
|
548
LuaBinaries/include/luaconf.h
Normal file
548
LuaBinaries/include/luaconf.h
Normal file
@ -0,0 +1,548 @@
|
||||
/*
|
||||
** $Id: luaconf.h,v 1.172 2012/05/11 14:14:42 roberto Exp $
|
||||
** Configuration file for Lua
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
|
||||
#ifndef lconfig_h
|
||||
#define lconfig_h
|
||||
|
||||
#include <limits.h>
|
||||
#include <stddef.h>
|
||||
|
||||
|
||||
/*
|
||||
** ==================================================================
|
||||
** Search for "@@" to find all configurable definitions.
|
||||
** ===================================================================
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
@@ LUA_ANSI controls the use of non-ansi features.
|
||||
** CHANGE it (define it) if you want Lua to avoid the use of any
|
||||
** non-ansi feature or library.
|
||||
*/
|
||||
#if !defined(LUA_ANSI) && defined(__STRICT_ANSI__)
|
||||
#define LUA_ANSI
|
||||
#endif
|
||||
|
||||
|
||||
#if !defined(LUA_ANSI) && defined(_WIN32) && !defined(_WIN32_WCE)
|
||||
#define LUA_WIN /* enable goodies for regular Windows platforms */
|
||||
#endif
|
||||
|
||||
#if defined(LUA_WIN)
|
||||
#define LUA_DL_DLL
|
||||
#define LUA_USE_AFORMAT /* assume 'printf' handles 'aA' specifiers */
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if defined(LUA_USE_LINUX)
|
||||
#define LUA_USE_POSIX
|
||||
#define LUA_USE_DLOPEN /* needs an extra library: -ldl */
|
||||
#define LUA_USE_READLINE /* needs some extra libraries */
|
||||
#define LUA_USE_STRTODHEX /* assume 'strtod' handles hexa formats */
|
||||
#define LUA_USE_AFORMAT /* assume 'printf' handles 'aA' specifiers */
|
||||
#define LUA_USE_LONGLONG /* assume support for long long */
|
||||
#endif
|
||||
|
||||
#if defined(LUA_USE_MACOSX)
|
||||
#define LUA_USE_POSIX
|
||||
#define LUA_USE_DLOPEN /* does not need -ldl */
|
||||
#define LUA_USE_READLINE /* needs an extra library: -lreadline */
|
||||
#define LUA_USE_STRTODHEX /* assume 'strtod' handles hexa formats */
|
||||
#define LUA_USE_AFORMAT /* assume 'printf' handles 'aA' specifiers */
|
||||
#define LUA_USE_LONGLONG /* assume support for long long */
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
@@ LUA_USE_POSIX includes all functionality listed as X/Open System
|
||||
@* Interfaces Extension (XSI).
|
||||
** CHANGE it (define it) if your system is XSI compatible.
|
||||
*/
|
||||
#if defined(LUA_USE_POSIX)
|
||||
#define LUA_USE_MKSTEMP
|
||||
#define LUA_USE_ISATTY
|
||||
#define LUA_USE_POPEN
|
||||
#define LUA_USE_ULONGJMP
|
||||
#define LUA_USE_GMTIME_R
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for
|
||||
@* Lua libraries.
|
||||
@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for
|
||||
@* C libraries.
|
||||
** CHANGE them if your machine has a non-conventional directory
|
||||
** hierarchy or if you want to install your libraries in
|
||||
** non-conventional directories.
|
||||
*/
|
||||
#if defined(_WIN32) /* { */
|
||||
/*
|
||||
** In Windows, any exclamation mark ('!') in the path is replaced by the
|
||||
** path of the directory of the executable file of the current process.
|
||||
*/
|
||||
#define LUA_LDIR "!\\lua\\"
|
||||
#define LUA_CDIR "!\\"
|
||||
#define LUA_PATH_DEFAULT \
|
||||
LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \
|
||||
LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" ".\\?.lua"
|
||||
#define LUA_CPATH_DEFAULT \
|
||||
LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll;" ".\\?.dll;" \
|
||||
LUA_CDIR"?52.dll;" ".\\?52.dll"
|
||||
|
||||
#else /* }{ */
|
||||
|
||||
#define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR "/"
|
||||
#define LUA_ROOT "/usr/local/"
|
||||
#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR
|
||||
#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR
|
||||
#define LUA_PATH_DEFAULT \
|
||||
LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \
|
||||
LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" "./?.lua"
|
||||
#define LUA_CPATH_DEFAULT \
|
||||
LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so;" \
|
||||
LUA_CDIR"lib?52.so;" "./lib?52.so"
|
||||
#endif /* } */
|
||||
|
||||
|
||||
/*
|
||||
@@ LUA_DIRSEP is the directory separator (for submodules).
|
||||
** CHANGE it if your machine does not use "/" as the directory separator
|
||||
** and is not Windows. (On Windows Lua automatically uses "\".)
|
||||
*/
|
||||
#if defined(_WIN32)
|
||||
#define LUA_DIRSEP "\\"
|
||||
#else
|
||||
#define LUA_DIRSEP "/"
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
@@ LUA_ENV is the name of the variable that holds the current
|
||||
@@ environment, used to access global names.
|
||||
** CHANGE it if you do not like this name.
|
||||
*/
|
||||
#define LUA_ENV "_ENV"
|
||||
|
||||
|
||||
/*
|
||||
@@ LUA_API is a mark for all core API functions.
|
||||
@@ LUALIB_API is a mark for all auxiliary library functions.
|
||||
@@ LUAMOD_API is a mark for all standard library opening functions.
|
||||
** CHANGE them if you need to define those functions in some special way.
|
||||
** For instance, if you want to create one Windows DLL with the core and
|
||||
** the libraries, you may want to use the following definition (define
|
||||
** LUA_BUILD_AS_DLL to get it).
|
||||
*/
|
||||
#if defined(LUA_BUILD_AS_DLL) /* { */
|
||||
|
||||
#if defined(LUA_CORE) || defined(LUA_LIB) /* { */
|
||||
#define LUA_API __declspec(dllexport)
|
||||
#else /* }{ */
|
||||
#define LUA_API __declspec(dllimport)
|
||||
#endif /* } */
|
||||
|
||||
#else /* }{ */
|
||||
|
||||
#define LUA_API extern
|
||||
|
||||
#endif /* } */
|
||||
|
||||
|
||||
/* more often than not the libs go together with the core */
|
||||
#define LUALIB_API LUA_API
|
||||
#define LUAMOD_API LUALIB_API
|
||||
|
||||
|
||||
/*
|
||||
@@ LUAI_FUNC is a mark for all extern functions that are not to be
|
||||
@* exported to outside modules.
|
||||
@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables
|
||||
@* that are not to be exported to outside modules (LUAI_DDEF for
|
||||
@* definitions and LUAI_DDEC for declarations).
|
||||
** CHANGE them if you need to mark them in some special way. Elf/gcc
|
||||
** (versions 3.2 and later) mark them as "hidden" to optimize access
|
||||
** when Lua is compiled as a shared library. Not all elf targets support
|
||||
** this attribute. Unfortunately, gcc does not offer a way to check
|
||||
** whether the target offers that support, and those without support
|
||||
** give a warning about it. To avoid these warnings, change to the
|
||||
** default definition.
|
||||
*/
|
||||
#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \
|
||||
defined(__ELF__) /* { */
|
||||
#define LUAI_FUNC __attribute__((visibility("hidden"))) extern
|
||||
#define LUAI_DDEC LUAI_FUNC
|
||||
#define LUAI_DDEF /* empty */
|
||||
|
||||
#else /* }{ */
|
||||
#define LUAI_FUNC extern
|
||||
#define LUAI_DDEC extern
|
||||
#define LUAI_DDEF /* empty */
|
||||
#endif /* } */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
@@ LUA_QL describes how error messages quote program elements.
|
||||
** CHANGE it if you want a different appearance.
|
||||
*/
|
||||
#define LUA_QL(x) "'" x "'"
|
||||
#define LUA_QS LUA_QL("%s")
|
||||
|
||||
|
||||
/*
|
||||
@@ LUA_IDSIZE gives the maximum size for the description of the source
|
||||
@* of a function in debug information.
|
||||
** CHANGE it if you want a different size.
|
||||
*/
|
||||
#define LUA_IDSIZE 60
|
||||
|
||||
|
||||
/*
|
||||
@@ luai_writestring/luai_writeline define how 'print' prints its results.
|
||||
** They are only used in libraries and the stand-alone program. (The #if
|
||||
** avoids including 'stdio.h' everywhere.)
|
||||
*/
|
||||
#if defined(LUA_LIB) || defined(lua_c)
|
||||
#include <stdio.h>
|
||||
#define luai_writestring(s,l) fwrite((s), sizeof(char), (l), stdout)
|
||||
#define luai_writeline() (luai_writestring("\n", 1), fflush(stdout))
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ luai_writestringerror defines how to print error messages.
|
||||
** (A format string with one argument is enough for Lua...)
|
||||
*/
|
||||
#define luai_writestringerror(s,p) \
|
||||
(fprintf(stderr, (s), (p)), fflush(stderr))
|
||||
|
||||
|
||||
/*
|
||||
@@ LUAI_MAXSHORTLEN is the maximum length for short strings, that is,
|
||||
** strings that are internalized. (Cannot be smaller than reserved words
|
||||
** or tags for metamethods, as these strings must be internalized;
|
||||
** #("function") = 8, #("__newindex") = 10.)
|
||||
*/
|
||||
#define LUAI_MAXSHORTLEN 40
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** {==================================================================
|
||||
** Compatibility with previous versions
|
||||
** ===================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ LUA_COMPAT_ALL controls all compatibility options.
|
||||
** You can define it to get all options, or change specific options
|
||||
** to fit your specific needs.
|
||||
*/
|
||||
#if defined(LUA_COMPAT_ALL) /* { */
|
||||
|
||||
/*
|
||||
@@ LUA_COMPAT_UNPACK controls the presence of global 'unpack'.
|
||||
** You can replace it with 'table.unpack'.
|
||||
*/
|
||||
#define LUA_COMPAT_UNPACK
|
||||
|
||||
/*
|
||||
@@ LUA_COMPAT_LOADERS controls the presence of table 'package.loaders'.
|
||||
** You can replace it with 'package.searchers'.
|
||||
*/
|
||||
#define LUA_COMPAT_LOADERS
|
||||
|
||||
/*
|
||||
@@ macro 'lua_cpcall' emulates deprecated function lua_cpcall.
|
||||
** You can call your C function directly (with light C functions).
|
||||
*/
|
||||
#define lua_cpcall(L,f,u) \
|
||||
(lua_pushcfunction(L, (f)), \
|
||||
lua_pushlightuserdata(L,(u)), \
|
||||
lua_pcall(L,1,0,0))
|
||||
|
||||
|
||||
/*
|
||||
@@ LUA_COMPAT_LOG10 defines the function 'log10' in the math library.
|
||||
** You can rewrite 'log10(x)' as 'log(x, 10)'.
|
||||
*/
|
||||
#define LUA_COMPAT_LOG10
|
||||
|
||||
/*
|
||||
@@ LUA_COMPAT_LOADSTRING defines the function 'loadstring' in the base
|
||||
** library. You can rewrite 'loadstring(s)' as 'load(s)'.
|
||||
*/
|
||||
#define LUA_COMPAT_LOADSTRING
|
||||
|
||||
/*
|
||||
@@ LUA_COMPAT_MAXN defines the function 'maxn' in the table library.
|
||||
*/
|
||||
#define LUA_COMPAT_MAXN
|
||||
|
||||
/*
|
||||
@@ The following macros supply trivial compatibility for some
|
||||
** changes in the API. The macros themselves document how to
|
||||
** change your code to avoid using them.
|
||||
*/
|
||||
#define lua_strlen(L,i) lua_rawlen(L, (i))
|
||||
|
||||
#define lua_objlen(L,i) lua_rawlen(L, (i))
|
||||
|
||||
#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ)
|
||||
#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT)
|
||||
|
||||
/*
|
||||
@@ LUA_COMPAT_MODULE controls compatibility with previous
|
||||
** module functions 'module' (Lua) and 'luaL_register' (C).
|
||||
*/
|
||||
#define LUA_COMPAT_MODULE
|
||||
|
||||
#endif /* } */
|
||||
|
||||
/* }================================================================== */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
@@ LUAI_BITSINT defines the number of bits in an int.
|
||||
** CHANGE here if Lua cannot automatically detect the number of bits of
|
||||
** your machine. Probably you do not need to change this.
|
||||
*/
|
||||
/* avoid overflows in comparison */
|
||||
#if INT_MAX-20 < 32760 /* { */
|
||||
#define LUAI_BITSINT 16
|
||||
#elif INT_MAX > 2147483640L /* }{ */
|
||||
/* int has at least 32 bits */
|
||||
#define LUAI_BITSINT 32
|
||||
#else /* }{ */
|
||||
#error "you must define LUA_BITSINT with number of bits in an integer"
|
||||
#endif /* } */
|
||||
|
||||
|
||||
/*
|
||||
@@ LUA_INT32 is an signed integer with exactly 32 bits.
|
||||
@@ LUAI_UMEM is an unsigned integer big enough to count the total
|
||||
@* memory used by Lua.
|
||||
@@ LUAI_MEM is a signed integer big enough to count the total memory
|
||||
@* used by Lua.
|
||||
** CHANGE here if for some weird reason the default definitions are not
|
||||
** good enough for your machine. Probably you do not need to change
|
||||
** this.
|
||||
*/
|
||||
#if LUAI_BITSINT >= 32 /* { */
|
||||
#define LUA_INT32 int
|
||||
#define LUAI_UMEM size_t
|
||||
#define LUAI_MEM ptrdiff_t
|
||||
#else /* }{ */
|
||||
/* 16-bit ints */
|
||||
#define LUA_INT32 long
|
||||
#define LUAI_UMEM unsigned long
|
||||
#define LUAI_MEM long
|
||||
#endif /* } */
|
||||
|
||||
|
||||
/*
|
||||
@@ LUAI_MAXSTACK limits the size of the Lua stack.
|
||||
** CHANGE it if you need a different limit. This limit is arbitrary;
|
||||
** its only purpose is to stop Lua to consume unlimited stack
|
||||
** space (and to reserve some numbers for pseudo-indices).
|
||||
*/
|
||||
#if LUAI_BITSINT >= 32
|
||||
#define LUAI_MAXSTACK 1000000
|
||||
#else
|
||||
#define LUAI_MAXSTACK 15000
|
||||
#endif
|
||||
|
||||
/* reserve some space for error handling */
|
||||
#define LUAI_FIRSTPSEUDOIDX (-LUAI_MAXSTACK - 1000)
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system.
|
||||
** CHANGE it if it uses too much C-stack space.
|
||||
*/
|
||||
#define LUAL_BUFFERSIZE BUFSIZ
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** {==================================================================
|
||||
@@ LUA_NUMBER is the type of numbers in Lua.
|
||||
** CHANGE the following definitions only if you want to build Lua
|
||||
** with a number type different from double. You may also need to
|
||||
** change lua_number2int & lua_number2integer.
|
||||
** ===================================================================
|
||||
*/
|
||||
|
||||
#define LUA_NUMBER_DOUBLE
|
||||
#define LUA_NUMBER double
|
||||
|
||||
/*
|
||||
@@ LUAI_UACNUMBER is the result of an 'usual argument conversion'
|
||||
@* over a number.
|
||||
*/
|
||||
#define LUAI_UACNUMBER double
|
||||
|
||||
|
||||
/*
|
||||
@@ LUA_NUMBER_SCAN is the format for reading numbers.
|
||||
@@ LUA_NUMBER_FMT is the format for writing numbers.
|
||||
@@ lua_number2str converts a number to a string.
|
||||
@@ LUAI_MAXNUMBER2STR is maximum size of previous conversion.
|
||||
*/
|
||||
#define LUA_NUMBER_SCAN "%lf"
|
||||
#define LUA_NUMBER_FMT "%.14g"
|
||||
#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n))
|
||||
#define LUAI_MAXNUMBER2STR 32 /* 16 digits, sign, point, and \0 */
|
||||
|
||||
|
||||
/*
|
||||
@@ lua_str2number converts a decimal numeric string to a number.
|
||||
@@ lua_strx2number converts an hexadecimal numeric string to a number.
|
||||
** In C99, 'strtod' do both conversions. C89, however, has no function
|
||||
** to convert floating hexadecimal strings to numbers. For these
|
||||
** systems, you can leave 'lua_strx2number' undefined and Lua will
|
||||
** provide its own implementation.
|
||||
*/
|
||||
#define lua_str2number(s,p) strtod((s), (p))
|
||||
|
||||
#if defined(LUA_USE_STRTODHEX)
|
||||
#define lua_strx2number(s,p) strtod((s), (p))
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
@@ The luai_num* macros define the primitive operations over numbers.
|
||||
*/
|
||||
|
||||
/* the following operations need the math library */
|
||||
#if defined(lobject_c) || defined(lvm_c)
|
||||
#include <math.h>
|
||||
#define luai_nummod(L,a,b) ((a) - floor((a)/(b))*(b))
|
||||
#define luai_numpow(L,a,b) (pow(a,b))
|
||||
#endif
|
||||
|
||||
/* these are quite standard operations */
|
||||
#if defined(LUA_CORE)
|
||||
#define luai_numadd(L,a,b) ((a)+(b))
|
||||
#define luai_numsub(L,a,b) ((a)-(b))
|
||||
#define luai_nummul(L,a,b) ((a)*(b))
|
||||
#define luai_numdiv(L,a,b) ((a)/(b))
|
||||
#define luai_numunm(L,a) (-(a))
|
||||
#define luai_numeq(a,b) ((a)==(b))
|
||||
#define luai_numlt(L,a,b) ((a)<(b))
|
||||
#define luai_numle(L,a,b) ((a)<=(b))
|
||||
#define luai_numisnan(L,a) (!luai_numeq((a), (a)))
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger.
|
||||
** CHANGE that if ptrdiff_t is not adequate on your machine. (On most
|
||||
** machines, ptrdiff_t gives a good choice between int or long.)
|
||||
*/
|
||||
#define LUA_INTEGER ptrdiff_t
|
||||
|
||||
/*
|
||||
@@ LUA_UNSIGNED is the integral type used by lua_pushunsigned/lua_tounsigned.
|
||||
** It must have at least 32 bits.
|
||||
*/
|
||||
#define LUA_UNSIGNED unsigned LUA_INT32
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** Some tricks with doubles
|
||||
*/
|
||||
|
||||
#if defined(LUA_CORE) && \
|
||||
defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) /* { */
|
||||
/*
|
||||
** The next definitions activate some tricks to speed up the
|
||||
** conversion from doubles to integer types, mainly to LUA_UNSIGNED.
|
||||
**
|
||||
@@ MS_ASMTRICK uses Microsoft assembler to avoid clashes with a
|
||||
** DirectX idiosyncrasy.
|
||||
**
|
||||
@@ LUA_IEEE754TRICK uses a trick that should work on any machine
|
||||
** using IEEE754 with a 32-bit integer type.
|
||||
**
|
||||
@@ LUA_IEEELL extends the trick to LUA_INTEGER; should only be
|
||||
** defined when LUA_INTEGER is a 32-bit integer.
|
||||
**
|
||||
@@ LUA_IEEEENDIAN is the endianness of doubles in your machine
|
||||
** (0 for little endian, 1 for big endian); if not defined, Lua will
|
||||
** check it dynamically for LUA_IEEE754TRICK (but not for LUA_NANTRICK).
|
||||
**
|
||||
@@ LUA_NANTRICK controls the use of a trick to pack all types into
|
||||
** a single double value, using NaN values to represent non-number
|
||||
** values. The trick only works on 32-bit machines (ints and pointers
|
||||
** are 32-bit values) with numbers represented as IEEE 754-2008 doubles
|
||||
** with conventional endianess (12345678 or 87654321), in CPUs that do
|
||||
** not produce signaling NaN values (all NaNs are quiet).
|
||||
*/
|
||||
|
||||
/* Microsoft compiler on a Pentium (32 bit) ? */
|
||||
#if defined(LUA_WIN) && defined(_MSC_VER) && defined(_M_IX86) /* { */
|
||||
|
||||
#define MS_ASMTRICK
|
||||
#define LUA_IEEEENDIAN 0
|
||||
#define LUA_NANTRICK
|
||||
|
||||
|
||||
/* pentium 32 bits? */
|
||||
#elif defined(__i386__) || defined(__i386) || defined(__X86__) /* }{ */
|
||||
|
||||
#define LUA_IEEE754TRICK
|
||||
#define LUA_IEEELL
|
||||
#define LUA_IEEEENDIAN 0
|
||||
#define LUA_NANTRICK
|
||||
|
||||
/* pentium 64 bits? */
|
||||
#elif defined(__x86_64) /* }{ */
|
||||
|
||||
#define LUA_IEEE754TRICK
|
||||
#define LUA_IEEEENDIAN 0
|
||||
|
||||
#elif defined(__POWERPC__) || defined(__ppc__) /* }{ */
|
||||
|
||||
#define LUA_IEEE754TRICK
|
||||
#define LUA_IEEEENDIAN 1
|
||||
|
||||
#else /* }{ */
|
||||
|
||||
/* assume IEEE754 and a 32-bit integer type */
|
||||
#define LUA_IEEE754TRICK
|
||||
|
||||
#endif /* } */
|
||||
|
||||
#endif /* } */
|
||||
|
||||
/* }================================================================== */
|
||||
|
||||
|
||||
|
||||
|
||||
/* =================================================================== */
|
||||
|
||||
/*
|
||||
** Local configuration. You can use this space to add your redefinitions
|
||||
** without modifying the main part of the file.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
55
LuaBinaries/include/lualib.h
Normal file
55
LuaBinaries/include/lualib.h
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
** $Id: lualib.h,v 1.43 2011/12/08 12:11:37 roberto Exp $
|
||||
** Lua standard libraries
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
|
||||
#ifndef lualib_h
|
||||
#define lualib_h
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
|
||||
|
||||
LUAMOD_API int (luaopen_base) (lua_State *L);
|
||||
|
||||
#define LUA_COLIBNAME "coroutine"
|
||||
LUAMOD_API int (luaopen_coroutine) (lua_State *L);
|
||||
|
||||
#define LUA_TABLIBNAME "table"
|
||||
LUAMOD_API int (luaopen_table) (lua_State *L);
|
||||
|
||||
#define LUA_IOLIBNAME "io"
|
||||
LUAMOD_API int (luaopen_io) (lua_State *L);
|
||||
|
||||
#define LUA_OSLIBNAME "os"
|
||||
LUAMOD_API int (luaopen_os) (lua_State *L);
|
||||
|
||||
#define LUA_STRLIBNAME "string"
|
||||
LUAMOD_API int (luaopen_string) (lua_State *L);
|
||||
|
||||
#define LUA_BITLIBNAME "bit32"
|
||||
LUAMOD_API int (luaopen_bit32) (lua_State *L);
|
||||
|
||||
#define LUA_MATHLIBNAME "math"
|
||||
LUAMOD_API int (luaopen_math) (lua_State *L);
|
||||
|
||||
#define LUA_DBLIBNAME "debug"
|
||||
LUAMOD_API int (luaopen_debug) (lua_State *L);
|
||||
|
||||
#define LUA_LOADLIBNAME "package"
|
||||
LUAMOD_API int (luaopen_package) (lua_State *L);
|
||||
|
||||
|
||||
/* open all previous libraries */
|
||||
LUALIB_API void (luaL_openlibs) (lua_State *L);
|
||||
|
||||
|
||||
|
||||
#if !defined(lua_assert)
|
||||
#define lua_assert(x) ((void)0)
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
BIN
LuaBinaries/liblua52.a
Normal file
BIN
LuaBinaries/liblua52.a
Normal file
Binary file not shown.
BIN
LuaBinaries/lua52.dll
Normal file
BIN
LuaBinaries/lua52.dll
Normal file
Binary file not shown.
15
UnitTests/DelphiLuaUnitTests.dpr
Normal file
15
UnitTests/DelphiLuaUnitTests.dpr
Normal file
@ -0,0 +1,15 @@
|
||||
program DelphiLuaUnitTests;
|
||||
|
||||
uses
|
||||
DUnitTestRunner,
|
||||
TestAPI in 'source\TestAPI.pas',
|
||||
Lua in '..\Lua.pas',
|
||||
Lua.Wrapper in '..\Lua.Wrapper.pas',
|
||||
TestWrapper in 'source\TestWrapper.pas';
|
||||
|
||||
{$R *.RES}
|
||||
|
||||
begin
|
||||
DUnitTestRunner.RunRegisteredTests;
|
||||
end.
|
||||
|
161
UnitTests/DelphiLuaUnitTests.dproj
Normal file
161
UnitTests/DelphiLuaUnitTests.dproj
Normal file
@ -0,0 +1,161 @@
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{B14CC7FE-413D-4162-9B05-E421D69F64BE}</ProjectGuid>
|
||||
<ProjectVersion>13.4</ProjectVersion>
|
||||
<FrameworkType>None</FrameworkType>
|
||||
<Base>True</Base>
|
||||
<Config Condition="'$(Config)'==''">Debug</Config>
|
||||
<Platform Condition="'$(Platform)'==''">Win32</Platform>
|
||||
<TargetedPlatforms>1</TargetedPlatforms>
|
||||
<AppType>Console</AppType>
|
||||
<MainSource>DelphiLuaUnitTests.dpr</MainSource>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
|
||||
<Base_Win64>true</Base_Win64>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
|
||||
<Base_Win32>true</Base_Win32>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
|
||||
<Cfg_1>true</Cfg_1>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
|
||||
<Cfg_1_Win32>true</Cfg_1_Win32>
|
||||
<CfgParent>Cfg_1</CfgParent>
|
||||
<Cfg_1>true</Cfg_1>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
|
||||
<Cfg_2_Win32>true</Cfg_2_Win32>
|
||||
<CfgParent>Cfg_2</CfgParent>
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base)'!=''">
|
||||
<Manifest_File>None</Manifest_File>
|
||||
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
|
||||
<VerInfo_Locale>1043</VerInfo_Locale>
|
||||
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace>
|
||||
<DCC_UsePackage>fmx;IndySystem;DBXInterBaseDriver;DataSnapCommon;DataSnapClient;DataSnapServer;DataSnapProviderClient;DbxCommonDriver;dbxcds;DBXOracleDriver;CustomIPTransport;dsnap;fmxase;IndyCore;inetdbxpress;IPIndyImpl;bindcompfmx;rtl;dbrtl;DbxClientDriver;bindcomp;inetdb;xmlrtl;IndyProtocols;DBXMySQLDriver;bindengine;soaprtl;DBXInformixDriver;DBXFirebirdDriver;inet;fmxobj;DBXSybaseASADriver;fmxdae;dbexpress;DataSnapIndy10ServerTransport;$(DCC_UsePackage)</DCC_UsePackage>
|
||||
<DCC_DcuOutput>.\lib</DCC_DcuOutput>
|
||||
<DCC_ExeOutput>.\bin</DCC_ExeOutput>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base_Win64)'!=''">
|
||||
<DCC_UsePackage>dxdborRS16;cxLibraryRS16;dxLayoutControlRS16;dxPScxPivotGridLnkRS16;dxCoreRS16;cxExportRS16;dxBarRS16;cxSpreadSheetRS16;cxTreeListdxBarPopupMenuRS16;TeeDB;dxDBXServerModeRS16;dxPsPrVwAdvRS16;dxPSCoreRS16;dxPScxTLLnkRS16;dxPScxGridLnkRS16;cxPageControlRS16;dxRibbonRS16;DBXSybaseASEDriver;vclimg;cxTreeListRS16;dxComnRS16;vcldb;vcldsnap;dxBarExtDBItemsRS16;DBXDb2Driver;vcl;DBXMSSQLDriver;cxDataRS16;cxBarEditItemRS16;dxDockingRS16;cxPageControldxBarPopupMenuRS16;cxSchedulerGridRS16;dxPSLnksRS16;dxBarExtItemsRS16;dxtrmdRS16;webdsnap;dxPSdxLCLnkRS16;dxorgcRS16;dxWizardControlRS16;dxPScxExtCommonRS16;dxNavBarRS16;dxPSdxDBOCLnkRS16;cxSchedulerTreeBrowserRS16;Tee;DBXOdbcDriver;dxdbtrRS16;dxPScxSSLnkRS16;cxPivotGridChartRS16;dxPScxCommonRS16;dxmdsRS16;dxPSPrVwRibbonRS16;cxGridRS16;cxEditorsRS16;cxPivotGridRS16;dxPSdxDBTVLnkRS16;dxPScxSchedulerLnkRS16;TeeUI;dxServerModeRS16;bindcompvcl;vclactnband;vclie;cxSchedulerRS16;vcltouch;websnap;VclSmp;dxTabbedMDIRS16;dxPSdxOCLnkRS16;dsnapcon;dxPSdxFCLnkRS16;dxThemeRS16;dxPScxPCProdRS16;vclx;dxFlowChartRS16;dxGDIPlusRS16;dxBarDBNavRS16;$(DCC_UsePackage)</DCC_UsePackage>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base_Win32)'!=''">
|
||||
<DCC_UsePackage>dxdborRS16;cxLibraryRS16;dxLayoutControlRS16;dxPScxPivotGridLnkRS16;dxCoreRS16;cxExportRS16;dxBarRS16;cxSpreadSheetRS16;cxTreeListdxBarPopupMenuRS16;TeeDB;dxDBXServerModeRS16;dxPsPrVwAdvRS16;vclib;dxPSCoreRS16;dxPScxTLLnkRS16;dxPScxGridLnkRS16;inetdbbde;cxPageControlRS16;dxRibbonRS16;DBXSybaseASEDriver;vclimg;cxTreeListRS16;fmi;dxComnRS16;vcldb;vcldsnap;dxBarExtDBItemsRS16;X2CLGL;DBXDb2Driver;vcl;CloudService;DBXMSSQLDriver;CodeSiteExpressPkg;FmxTeeUI;cxDataRS16;cxBarEditItemRS16;dxDockingRS16;cxPageControldxBarPopupMenuRS16;cxSchedulerGridRS16;dxPSLnksRS16;dxBarExtItemsRS16;dxtrmdRS16;webdsnap;X2CLMB;OmniThreadLibraryRuntimeXE2;adortl;dxPSdxLCLnkRS16;dxorgcRS16;dxWizardControlRS16;dxPScxExtCommonRS16;vcldbx;dxNavBarRS16;dxPSdxDBOCLnkRS16;cxSchedulerTreeBrowserRS16;Tee;DBXOdbcDriver;dxdbtrRS16;svnui;dxPScxSSLnkRS16;cxPivotGridChartRS16;dxPScxCommonRS16;dxmdsRS16;dxPSPrVwRibbonRS16;ibxpress;cxGridRS16;cxEditorsRS16;cxPivotGridRS16;dxPSdxDBTVLnkRS16;FMXTee;dxPScxSchedulerLnkRS16;TeeUI;dxServerModeRS16;bindcompvcl;vclactnband;vclie;cxSchedulerRS16;vcltouch;websnap;VclSmp;dxTabbedMDIRS16;DataSnapConnectors;dxPSdxOCLnkRS16;dsnapcon;dxPSdxFCLnkRS16;dxThemeRS16;dxPScxPCProdRS16;vclx;svn;dxFlowChartRS16;bdertl;VirtualTreesR;dxGDIPlusRS16;dxBarDBNavRS16;$(DCC_UsePackage)</DCC_UsePackage>
|
||||
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
|
||||
<VerInfo_Locale>1033</VerInfo_Locale>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
||||
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
|
||||
<DCC_Optimize>false</DCC_Optimize>
|
||||
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
|
||||
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
|
||||
<DCC_RemoteDebug>true</DCC_RemoteDebug>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
|
||||
<VerInfo_Locale>1033</VerInfo_Locale>
|
||||
<DCC_RemoteDebug>false</DCC_RemoteDebug>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
||||
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
|
||||
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
|
||||
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
|
||||
<DCC_DebugInformation>false</DCC_DebugInformation>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
|
||||
<VerInfo_Locale>1033</VerInfo_Locale>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<DelphiCompile Include="$(MainSource)">
|
||||
<MainSource>MainSource</MainSource>
|
||||
</DelphiCompile>
|
||||
<DCCReference Include="source\TestAPI.pas"/>
|
||||
<DCCReference Include="..\Lua.pas"/>
|
||||
<DCCReference Include="..\Lua.Wrapper.pas"/>
|
||||
<DCCReference Include="source\TestWrapper.pas"/>
|
||||
<BuildConfiguration Include="Release">
|
||||
<Key>Cfg_2</Key>
|
||||
<CfgParent>Base</CfgParent>
|
||||
</BuildConfiguration>
|
||||
<BuildConfiguration Include="Base">
|
||||
<Key>Base</Key>
|
||||
</BuildConfiguration>
|
||||
<BuildConfiguration Include="Debug">
|
||||
<Key>Cfg_1</Key>
|
||||
<CfgParent>Base</CfgParent>
|
||||
</BuildConfiguration>
|
||||
</ItemGroup>
|
||||
<ProjectExtensions>
|
||||
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
|
||||
<Borland.ProjectType/>
|
||||
<BorlandProject>
|
||||
<Delphi.Personality>
|
||||
<VersionInfo>
|
||||
<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
|
||||
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
|
||||
<VersionInfo Name="MajorVer">1</VersionInfo>
|
||||
<VersionInfo Name="MinorVer">0</VersionInfo>
|
||||
<VersionInfo Name="Release">0</VersionInfo>
|
||||
<VersionInfo Name="Build">0</VersionInfo>
|
||||
<VersionInfo Name="Debug">False</VersionInfo>
|
||||
<VersionInfo Name="PreRelease">False</VersionInfo>
|
||||
<VersionInfo Name="Special">False</VersionInfo>
|
||||
<VersionInfo Name="Private">False</VersionInfo>
|
||||
<VersionInfo Name="DLL">False</VersionInfo>
|
||||
<VersionInfo Name="Locale">1043</VersionInfo>
|
||||
<VersionInfo Name="CodePage">1252</VersionInfo>
|
||||
</VersionInfo>
|
||||
<VersionInfoKeys>
|
||||
<VersionInfoKeys Name="CompanyName"/>
|
||||
<VersionInfoKeys Name="FileDescription"/>
|
||||
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="InternalName"/>
|
||||
<VersionInfoKeys Name="LegalCopyright"/>
|
||||
<VersionInfoKeys Name="LegalTrademarks"/>
|
||||
<VersionInfoKeys Name="OriginalFilename"/>
|
||||
<VersionInfoKeys Name="ProductName"/>
|
||||
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
|
||||
<VersionInfoKeys Name="Comments"/>
|
||||
</VersionInfoKeys>
|
||||
<Source>
|
||||
<Source Name="MainSource">DelphiLuaUnitTests.dpr</Source>
|
||||
</Source>
|
||||
<Excluded_Packages>
|
||||
<Excluded_Packages Name="F:\Components\bin\DXE2\win32\JvBDEDesign160.bpl">JVCL BDE Components</Excluded_Packages>
|
||||
</Excluded_Packages>
|
||||
</Delphi.Personality>
|
||||
<Deployment/>
|
||||
<Platforms>
|
||||
<Platform value="Win64">False</Platform>
|
||||
<Platform value="OSX32">False</Platform>
|
||||
<Platform value="Win32">True</Platform>
|
||||
</Platforms>
|
||||
<UnitTesting>
|
||||
<TestFramework>DUnit / Delphi Win32</TestFramework>
|
||||
<TestRunner>GUI</TestRunner>
|
||||
<TestProjectName/>
|
||||
<SourceProjectName/>
|
||||
</UnitTesting>
|
||||
</BorlandProject>
|
||||
<ProjectFileVersion>12</ProjectFileVersion>
|
||||
</ProjectExtensions>
|
||||
<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
|
||||
<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/>
|
||||
</Project>
|
BIN
UnitTests/DelphiLuaUnitTests.res
Normal file
BIN
UnitTests/DelphiLuaUnitTests.res
Normal file
Binary file not shown.
128
UnitTests/source/TestAPI.pas
Normal file
128
UnitTests/source/TestAPI.pas
Normal file
@ -0,0 +1,128 @@
|
||||
unit TestAPI;
|
||||
|
||||
interface
|
||||
uses
|
||||
TestFramework;
|
||||
|
||||
|
||||
type
|
||||
TTestAPI = class(TTestCase)
|
||||
protected
|
||||
procedure SetUp; override;
|
||||
published
|
||||
procedure NewStateAndClose;
|
||||
procedure Load;
|
||||
procedure LoadAndCall;
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
uses
|
||||
Classes,
|
||||
SysUtils,
|
||||
|
||||
Lua;
|
||||
|
||||
|
||||
{ TTestAPI }
|
||||
procedure TTestAPI.SetUp;
|
||||
begin
|
||||
inherited;
|
||||
|
||||
LoadLuaLib;
|
||||
end;
|
||||
|
||||
|
||||
procedure TTestAPI.NewStateAndClose;
|
||||
var
|
||||
state: lua_State;
|
||||
|
||||
begin
|
||||
state := lua_newstate(@DefaultLuaAlloc, nil);
|
||||
try
|
||||
Check(Assigned(state), 'state is not assigned');
|
||||
finally
|
||||
lua_close(state);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
type
|
||||
PLuaScript = ^TLuaScript;
|
||||
TLuaScript = record
|
||||
Data: AnsiString;
|
||||
Remaining: Integer;
|
||||
|
||||
constructor Create(const AData: string);
|
||||
end;
|
||||
|
||||
|
||||
{ TLuaScript }
|
||||
constructor TLuaScript.Create(const AData: string);
|
||||
begin
|
||||
Data := AnsiString(AData);
|
||||
Remaining := Length(Data);
|
||||
end;
|
||||
|
||||
|
||||
function TestReaderProc(L: lua_State; ud: Pointer; var sz: size_t): PAnsiChar; cdecl;
|
||||
var
|
||||
script: PLuaScript;
|
||||
|
||||
begin
|
||||
script := ud;
|
||||
if script^.Remaining = 0 then
|
||||
begin
|
||||
Result := nil;
|
||||
exit;
|
||||
end;
|
||||
|
||||
sz := script^.Remaining;
|
||||
script^.Remaining := 0;
|
||||
|
||||
Result := PAnsiChar(script^.Data);
|
||||
end;
|
||||
|
||||
|
||||
procedure TTestAPI.Load;
|
||||
var
|
||||
state: lua_State;
|
||||
script: TLuaScript;
|
||||
|
||||
begin
|
||||
state := lua_newstate(@DefaultLuaAlloc, nil);
|
||||
try
|
||||
script := TLuaScript.Create('print("Hello world!")');
|
||||
CheckEquals(0, lua_load(state, @TestReaderProc, @script, nil, nil), 'lua_load result');
|
||||
finally
|
||||
lua_close(state);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TTestAPI.LoadAndCall;
|
||||
var
|
||||
state: lua_State;
|
||||
script: TLuaScript;
|
||||
|
||||
begin
|
||||
state := lua_newstate(@DefaultLuaAlloc, nil);
|
||||
try
|
||||
luaopen_base(state);
|
||||
|
||||
script := TLuaScript.Create('print("Hello world!")');
|
||||
CheckEquals(0, lua_load(state, @TestReaderProc, @script, nil, nil), 'lua_load result');
|
||||
|
||||
if lua_pcall(state, 0, 0, 0) <> 0 then
|
||||
Fail(string(lua_tolstring(state, -1, nil)));
|
||||
finally
|
||||
lua_close(state);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
initialization
|
||||
RegisterTest(TTestAPI.Suite);
|
||||
|
||||
end.
|
106
UnitTests/source/TestWrapper.pas
Normal file
106
UnitTests/source/TestWrapper.pas
Normal file
@ -0,0 +1,106 @@
|
||||
unit TestWrapper;
|
||||
|
||||
interface
|
||||
uses
|
||||
System.SysUtils,
|
||||
|
||||
TestFramework,
|
||||
|
||||
Lua.Wrapper;
|
||||
|
||||
|
||||
type
|
||||
TTestWrapper = class(TTestCase)
|
||||
private
|
||||
FLua: TLua;
|
||||
FPrinted: TStringBuilder;
|
||||
protected
|
||||
procedure SetUp; override;
|
||||
procedure TearDown; override;
|
||||
|
||||
property Lua: TLua read FLua;
|
||||
property Printed: TStringBuilder read FPrinted;
|
||||
published
|
||||
procedure NewState;
|
||||
procedure LoadAndCallFromString;
|
||||
procedure LoadAndCallFromStream;
|
||||
|
||||
procedure FunctionResult;
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
uses
|
||||
System.Classes;
|
||||
|
||||
|
||||
type
|
||||
TProtectedLua = class(TLua);
|
||||
|
||||
|
||||
{ TTestWrapper }
|
||||
procedure TTestWrapper.SetUp;
|
||||
begin
|
||||
inherited;
|
||||
|
||||
FPrinted := TStringBuilder.Create;
|
||||
|
||||
FLua := TLua.Create;
|
||||
FLua.RegisterFunction('print',
|
||||
procedure(AContext: ILuaContext)
|
||||
begin
|
||||
FPrinted.Append(AContext.Parameters.ToString);
|
||||
end);
|
||||
end;
|
||||
|
||||
|
||||
procedure TTestWrapper.TearDown;
|
||||
begin
|
||||
FreeAndNil(FPrinted);
|
||||
FreeAndNil(FLua);
|
||||
|
||||
inherited;
|
||||
end;
|
||||
|
||||
|
||||
procedure TTestWrapper.NewState;
|
||||
begin
|
||||
TProtectedLua(Lua).CheckState;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure TTestWrapper.LoadAndCallFromString;
|
||||
begin
|
||||
Lua.LoadFromString('print("Hello world!")');
|
||||
Lua.Call;
|
||||
CheckEquals('Hello world!', Printed.ToString);
|
||||
end;
|
||||
|
||||
|
||||
procedure TTestWrapper.LoadAndCallFromStream;
|
||||
begin
|
||||
Lua.LoadFromStream(TStringStream.Create('print("Hello world!")'));
|
||||
Lua.Call;
|
||||
CheckEquals('Hello world!', Printed.ToString);
|
||||
end;
|
||||
|
||||
|
||||
procedure TTestWrapper.FunctionResult;
|
||||
begin
|
||||
Lua.RegisterFunction('myuppercase',
|
||||
procedure(AContext: ILuaContext)
|
||||
begin
|
||||
AContext.Result.Push(UpperCase(AContext.Parameters[0].AsString));
|
||||
end);
|
||||
|
||||
Lua.LoadFromString('print(myuppercase("Hello world!"))');
|
||||
Lua.Call;
|
||||
CheckEquals('HELLO WORLD!', Printed.ToString);
|
||||
end;
|
||||
|
||||
|
||||
initialization
|
||||
RegisterTest(TTestWrapper.Suite);
|
||||
|
||||
end.
|
Loading…
x
Reference in New Issue
Block a user