Lua_MGList.pas 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. //******************************************************************************
  2. //*** LUA SCRIPT FUNCTIONS ***
  3. //*** ***
  4. //*** (c) Massimo Magnano 2005 ***
  5. //*** ***
  6. //*** ***
  7. //******************************************************************************
  8. // File : Lua_MGList.pas
  9. //
  10. // Description : Access from Lua scripts to TMGList Classes
  11. //
  12. //******************************************************************************
  13. //
  14. // Lua Exported functions :
  15. //
  16. // GetMGList{Name=string} return TMGList object.
  17. // TMGList:FindFirst() return Data as Pointer.
  18. // TMGList:FindNext() return Data as Pointer.
  19. // TMGList:FindClose() return Status as boolean.
  20. // TMGList:GetCount() return Count as Int.
  21. // TMGList:GetData(integer DataPointer, string DataName) return Data.
  22. // TMGList:Find([variant Param1[,...[, ParamN]]) return Data as Pointer.
  23. unit Lua_MGList;
  24. interface
  25. uses Lua, Classes, MGList, Variants;
  26. function AddMGList(Name :String; List :TMGList) :Boolean;
  27. function DeleteMGList(Name :String) :Boolean;
  28. function FindMGList(Name :String) :TMGList;
  29. procedure RegisterFunctions(L: Plua_State);
  30. implementation
  31. uses LuaUtils, SysUtils;
  32. const
  33. HANDLE_STR ='Lua_MGList_Handle';
  34. type
  35. TMGListDescr = record
  36. Name :String;
  37. List :TMGList;
  38. end;
  39. PMGListDescr = ^TMGListDescr;
  40. TLuaMGList = class(TMGList)
  41. protected
  42. function allocData :Pointer; override;
  43. procedure deallocData(pData :Pointer); override;
  44. function FindByName(Tag :Integer; ptData1, ptData2 :Pointer) :Boolean;
  45. public
  46. function Find(Name :String): PMGListDescr; overload;
  47. function Add(Name :String; List :TMGList) :PMGListDescr; overload;
  48. function Delete(Name :String) :Boolean; overload;
  49. end;
  50. Var
  51. LuaMGList :TLuaMGList =Nil;
  52. //========================== Lua Functions TMGList ==============================
  53. function GetPMGListDescr(L: Plua_State; Index: Integer): PMGListDescr;
  54. begin
  55. Result := PMGListDescr(LuaGetTableLightUserData(L, Index, HANDLE_STR));
  56. end;
  57. function LuaFindFirstMGList(L: Plua_State): Integer; cdecl;
  58. Var
  59. theList :TMGList;
  60. NParams :Integer;
  61. xFind :Pointer;
  62. begin
  63. Result := 0;
  64. NParams := lua_gettop(L);
  65. if (NParams=1)
  66. then begin
  67. try
  68. theList :=GetPMGListDescr(L, 1)^.List;
  69. xFind := theList.FindFirst;
  70. if (xFind<>Nil)
  71. then begin
  72. lua_pushlightuserdata(L, xFind);
  73. Result :=1;
  74. end;
  75. except
  76. On E:Exception do begin
  77. //LuaError(L, ERR_Script+E.Message);
  78. end;
  79. end;
  80. end;
  81. end;
  82. function LuaFindNextMGList(L: Plua_State): Integer; cdecl;
  83. Var
  84. theList :TMGList;
  85. NParams :Integer;
  86. xFind :Pointer;
  87. begin
  88. Result := 0;
  89. NParams := lua_gettop(L);
  90. if (NParams=1)
  91. then begin
  92. try
  93. theList :=GetPMGListDescr(L, 1)^.List;
  94. xFind := theList.FindNext;
  95. if (xFind<>Nil)
  96. then begin
  97. lua_pushlightuserdata(L, xFind);
  98. Result :=1;
  99. end;
  100. except
  101. On E:Exception do begin
  102. //LuaError(L, ERR_Script+E.Message);
  103. end;
  104. end;
  105. end;
  106. end;
  107. function LuaFindCloseMGList(L: Plua_State): Integer; cdecl;
  108. Var
  109. theList :TMGList;
  110. NParams :Integer;
  111. begin
  112. Result := 0;
  113. NParams := lua_gettop(L);
  114. if (NParams=1)
  115. then begin
  116. try
  117. theList :=GetPMGListDescr(L, 1)^.List;
  118. theList.FindClose;
  119. LuaPushBoolean(L, True);
  120. Result := 1;
  121. except
  122. On E:Exception do begin
  123. //LuaError(L, ERR_Script+E.Message);
  124. end;
  125. end;
  126. end;
  127. end;
  128. function LuaGetCountMGList(L: Plua_State): Integer; cdecl;
  129. Var
  130. theList :TMGList;
  131. NParams :Integer;
  132. begin
  133. Result := 0;
  134. NParams := lua_gettop(L);
  135. if (NParams=1)
  136. then begin
  137. try
  138. theList :=GetPMGListDescr(L, 1)^.List;
  139. LuaPushInteger(L, theList.Count);
  140. Result := 1;
  141. except
  142. On E:Exception do begin
  143. //LuaError(L, ERR_Script+E.Message);
  144. end;
  145. end;
  146. end;
  147. end;
  148. function LuaGetDataMGList(L: Plua_State): Integer; cdecl;
  149. Var
  150. theListDescr :PMGListDescr;
  151. NParams :Integer;
  152. DataName :String;
  153. CurrentData :Pointer;
  154. xResult :Variant;
  155. begin
  156. Result := 0;
  157. NParams := lua_gettop(L);
  158. if (NParams=3)
  159. then begin
  160. try
  161. theListDescr :=GetPMGListDescr(L, 1);
  162. CurrentData :=lua_touserdata(L, 2);
  163. DataName :=LuaToString(L, 3);
  164. if (CurrentData<>Nil)
  165. then begin
  166. xResult :=theListDescr^.List.GetData(CurrentData, DataName);
  167. LuaPushVariant(L, xResult);
  168. Result := 1;
  169. end;
  170. except
  171. On E:Exception do begin
  172. //LuaError(L, ERR_Script+E.Message);
  173. end;
  174. end;
  175. end;
  176. end;
  177. function LuaFindMGList(L: Plua_State): Integer; cdecl;
  178. Var
  179. theListDescr :PMGListDescr;
  180. NParams,
  181. iParams :Integer;
  182. xResult :Variant;
  183. xFind :Pointer;
  184. theParams :array of Variant;
  185. begin
  186. Result := 0;
  187. NParams := lua_gettop(L);
  188. if (NParams>1)
  189. then begin
  190. try
  191. theListDescr :=GetPMGListDescr(L, 1);
  192. SetLength(theParams, (NParams-1));
  193. for iParams :=2 to NParams do
  194. begin
  195. xResult :=LuaToVariant(L, iParams);
  196. theParams[iParams-2] :=xResult;
  197. end;
  198. xFind :=theListDescr^.List.Find(theParams);
  199. if (xFind<>Nil)
  200. then begin
  201. lua_pushlightuserdata(L, xFind);
  202. Result :=1;
  203. end;
  204. except
  205. On E:Exception do begin
  206. //LuaError(L, ERR_Script+E.Message);
  207. end;
  208. end;
  209. end;
  210. end;
  211. function LuaGetMGList(L: Plua_State): Integer; cdecl;
  212. Var
  213. ListName :String;
  214. xResult :PMGListDescr;
  215. begin
  216. Result := 0;
  217. try
  218. ListName :=LuaGetTableString(L, 1, 'Name');
  219. LuaSetTableNil(L, 1, 'Name');
  220. xResult :=LuaMGList.Find(ListName);
  221. if (xResult=Nil)
  222. then raise Exception.Create('Unable to Locate List '+ListName);
  223. LuaSetTableLightUserData(L, 1, HANDLE_STR, xResult);
  224. LuaSetTableFunction(L, 1, 'FindFirst', LuaFindFirstMGList);
  225. LuaSetTableFunction(L, 1, 'FindNext', LuaFindNextMGList);
  226. LuaSetTableFunction(L, 1, 'FindClose', LuaFindCloseMGList);
  227. LuaSetTableFunction(L, 1, 'GetCount', LuaGetCountMGList);
  228. LuaSetTableFunction(L, 1, 'GetData', LuaGetDataMGList);
  229. LuaSetTableFunction(L, 1, 'Find', LuaFindMGList);
  230. Result := 1;
  231. except
  232. On E:Exception do begin
  233. //LuaError(L, ERR_Script+E.Message);
  234. end;
  235. end;
  236. end;
  237. //==============================================================================
  238. //======================== TLuaMGList Class ====================================
  239. function TLuaMGList.allocData :Pointer;
  240. begin
  241. GetMem(Result, sizeOf(TMGListDescr));
  242. FillChar(Result^, sizeOf(TMGListDescr), 0);
  243. end;
  244. procedure TLuaMGList.deallocData(pData :Pointer);
  245. begin
  246. //Evito eventuali problemi per allocazione delle stringhe in Delphi.
  247. PMGListDescr(pData)^.Name :='';
  248. FreeMem(pData, sizeOf(TMGListDescr));
  249. end;
  250. function TLuaMGList.FindByName(Tag :Integer; ptData1, ptData2 :Pointer) :Boolean;
  251. begin
  252. Result := (String(PChar(ptData1)) = PMGListDescr(ptData2)^.Name);
  253. end;
  254. function TLuaMGList.Find(Name :String): PMGListDescr;
  255. begin
  256. Result :=Self.ExtFind(PChar(Uppercase(Name)), 0, FindByName);
  257. end;
  258. function TLuaMGList.Add(Name :String; List :TMGList) :PMGListDescr;
  259. Var
  260. toFind :PMGListDescr;
  261. begin
  262. toFind :=Find(Name);
  263. if (toFind=Nil)
  264. then begin
  265. toFind :=Self.Add;
  266. toFind^.Name :=Uppercase(Name);
  267. end;
  268. toFind^.List :=List;
  269. Result :=toFind;
  270. end;
  271. function TLuaMGList.Delete(Name :String) :Boolean;
  272. begin
  273. Result :=Delete(PChar(Uppercase(Name)), 0, FindByName);
  274. end;
  275. //==============================================================================
  276. //======================== Public Functions ====================================
  277. function AddMGList(Name :String; List :TMGList) :Boolean;
  278. begin
  279. Result :=False;
  280. if (LuaMGList<>Nil)
  281. then begin
  282. try
  283. Result := (LuaMGList.Add(Name, List) <> Nil);
  284. except
  285. On E:Exception do begin end;
  286. end;
  287. end;
  288. end;
  289. function DeleteMGList(Name :String) :Boolean;
  290. begin
  291. Result :=False;
  292. if (LuaMGList<>Nil)
  293. then begin
  294. try
  295. Result := LuaMGList.Delete(Name);
  296. except
  297. On E:Exception do begin end;
  298. end;
  299. end;
  300. end;
  301. function FindMGList(Name :String) :TMGList;
  302. Var
  303. toFind :PMGListDescr;
  304. begin
  305. Result :=Nil;
  306. if (LuaMGList<>Nil)
  307. then begin
  308. try
  309. toFind :=LuaMGList.Find(Name);
  310. if (toFind<>Nil)
  311. then Result :=toFind.List;
  312. except
  313. On E:Exception do begin end;
  314. end;
  315. end;
  316. end;
  317. procedure RegisterFunctions(L: Plua_State);
  318. begin
  319. LuaRegister(L, 'GetMGList', LuaGetMGList);
  320. end;
  321. initialization
  322. LuaMGList :=TLuaMGList.Create;
  323. finalization
  324. LuaMGList.Free;
  325. LuaMGList :=Nil;
  326. end.