LuaExtend.c
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:7k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. // 
  4. // File: LuaExtend.cpp
  5. // Date: 2001-9-27 15:46:40
  6. // Code: Romandou
  7. // Desc: 扩展的LuaAPI函数
  8. //---------------------------------------------------------------------------
  9. #include "Lua.h"
  10. #include "string.h"
  11. #include <stdio.h>
  12. #include <stdarg.h>
  13. //---------------------------------------------------------------------------
  14. // 函数: Lua_SetTable
  15. // 功能: 修改Lua table中的某个成员的值
  16. // 参数: Lua_State * L
  17. // 参数: int nIndex 数组在堆中的index
  18. // 参数: const char * szMemberName 以字符串表示成员的名称
  19. // 参数: double Number 成员的数值
  20. // 返回: int 
  21. //---------------------------------------------------------------------------
  22. //---------------------------------------------------------------------------
  23. //                   Lua_SetTableMember
  24. //    该函数体由若干的函数组成,以实现改变Lua Table中的某个变量的值
  25. //    Lua的Table的表现形式有两种,一种是以数字形式表示如 Table[1],而另一
  26. //   种是以字符串的形式表示,如Table.Member。
  27. //   同时,变量值还包括Number、String、CFun等
  28. //     nIndex为数组在堆栈中的位置。
  29. //---------------------------------------------------------------------------
  30. int Lua_SetTable_DoubleFromName(Lua_State * L, int nIndex, const char * szMemberName, double Number)
  31. {
  32. if (! Lua_IsTable(L, nIndex))
  33. return 0;
  34. Lua_PushString(L, szMemberName);
  35. Lua_PushNumber(L, Number);
  36. Lua_SetTable(L, nIndex);
  37. return 1;
  38. }
  39. //---------------------------------------------------------------------------
  40. // 函数: Lua_SetTable_IntFromName
  41. // 功能:
  42. // 参数: Lua_State * L
  43. // 参数: int nIndex
  44. // 参数: const char * szMemberName
  45. // 参数: int Number
  46. // 返回: int 
  47. //---------------------------------------------------------------------------
  48. int Lua_SetTable_IntFromName(Lua_State * L, int nIndex, const char * szMemberName, int Number)
  49. {
  50. if (! Lua_IsTable(L, nIndex))
  51. return 0;
  52. Lua_PushString(L, szMemberName);
  53. Lua_PushNumber(L, (double)Number);
  54. Lua_SetTable(L, nIndex);
  55. return 1;
  56. }
  57. //---------------------------------------------------------------------------
  58. // 函数: Lua_SetTable_StringFromName
  59. // 功能:
  60. // 参数: Lua_State * L
  61. // 参数: int nIndex
  62. // 参数: const char * szMemberName
  63. // 参数: char * szString
  64. // 返回: int 
  65. //---------------------------------------------------------------------------
  66. int Lua_SetTable_StringFromName(Lua_State * L ,int nIndex, const char * szMemberName, char * szString)
  67. {
  68. if (! Lua_IsTable(L, nIndex))
  69. return 0;
  70. Lua_PushString(L, szMemberName);
  71. Lua_PushString(L, szString);
  72. Lua_SetTable(L, nIndex);
  73. return 1;
  74. }
  75. //---------------------------------------------------------------------------
  76. // 函数: Lua_SetTable_StringFromId
  77. // 功能:
  78. // 参数: Lua_State * L
  79. // 参数: int nIndex
  80. // 参数: int Id
  81. // 参数: const char * szString
  82. // 返回: int 
  83. //---------------------------------------------------------------------------
  84. int Lua_SetTable_StringFromId(Lua_State * L, int nIndex, int Id, const char * szString)
  85. {
  86. if (! Lua_IsTable(L, nIndex))
  87. return 0;
  88. Lua_PushNumber(L, (double)Id);
  89. Lua_PushString(L, szString);
  90. Lua_SetTable(L, nIndex);
  91. return 1;
  92. }
  93. //---------------------------------------------------------------------------
  94. // 函数: Lua_SetTable_DoubleFromId
  95. // 功能:
  96. // 参数: Lua_State * L
  97. // 参数: int nIndex
  98. // 参数: int Id
  99. // 参数: double nNumber
  100. // 返回: int 
  101. //---------------------------------------------------------------------------
  102. int Lua_SetTable_DoubleFromId(Lua_State * L , int nIndex, int Id, double nNumber)
  103. {
  104. if (! Lua_IsTable(L, nIndex))
  105. return 0;
  106. Lua_PushNumber(L, (double) Id);
  107. Lua_PushNumber(L, nNumber);
  108. Lua_SetTable(L, nIndex);
  109. return 1;
  110. }
  111. //---------------------------------------------------------------------------
  112. // 函数: Lua_SetTable_IntFromId
  113. // 功能:
  114. // 参数: Lua_State * L
  115. // 参数: int nIndex
  116. // 参数: int Id
  117. // 参数: int nNumber
  118. // 返回: int 
  119. //---------------------------------------------------------------------------
  120. int Lua_SetTable_IntFromId(Lua_State * L, int nIndex, int Id, int nNumber)
  121. {
  122. if (! Lua_IsTable(L, nIndex))
  123. return 0;
  124. Lua_PushNumber(L, (double) Id);
  125. Lua_PushNumber(L, (double) nNumber);
  126. Lua_SetTable(L, nIndex);
  127. return 1;
  128. }
  129. //---------------------------------------------------------------------------
  130. // 函数: Lua_SetTable_CFunFromName
  131. // 功能:
  132. // 参数: Lua_State * L
  133. // 参数: int nIndex
  134. // 参数: const char * szMemberName
  135. // 参数: Lua_CFunction CFun
  136. // 返回: int 
  137. //---------------------------------------------------------------------------
  138. int Lua_SetTable_CFunFromName(Lua_State * L, int nIndex, const char * szMemberName, Lua_CFunction CFun)
  139. {
  140. if (! Lua_IsTable(L, nIndex))
  141. return 0;
  142. Lua_PushString(L, szMemberName);
  143. Lua_PushCFunction(L, CFun);
  144. Lua_SetTable(L, nIndex);
  145. return 1;
  146. }
  147. //---------------------------------------------------------------------------
  148. // 函数: Lua_SetTable_CFunFromId
  149. // 功能:
  150. // 参数: Lua_State * L
  151. // 参数: int nIndex
  152. // 参数: int nId
  153. // 参数: Lua_CFunction CFun
  154. // 返回: int 
  155. //---------------------------------------------------------------------------
  156. int Lua_SetTable_CFunFromId(Lua_State * L, int nIndex, int nId, Lua_CFunction CFun)
  157. {
  158. if (! Lua_IsTable(L, nIndex))
  159. return 0;
  160. Lua_PushNumber(L, nId);
  161. Lua_PushCFunction(L, CFun);
  162. Lua_SetTable(L, nIndex);
  163. return 1;
  164. }
  165. //---------------------------------------------------------------------------
  166. // 函数: Lua_GetValuesFromStack
  167. // 功能:
  168. // 参数: Lua_State * L
  169. // 参数: char * cFormat
  170. // 参数: ...
  171. // 返回: int 
  172. //---------------------------------------------------------------------------
  173. int Lua_GetValuesFromStack(Lua_State * L, char * cFormat, ...)
  174. {
  175. va_list vlist;
  176. double* pNumber;
  177.  const char  *pString;
  178.    const char ** pStrPoint;
  179. int i = 0;
  180. int nTopIndex = 0;
  181. int nIndex = 0;
  182. int nValueNum = 0;//cFormat的字符长度,表示需要取的参数数量
  183. if (! L)
  184. return 0;
  185. nTopIndex = Lua_GetTopIndex(L);
  186. nValueNum = strlen(cFormat);
  187. if (nTopIndex == 0 || nValueNum == 0)//当堆栈中无数据或不取参数是返回FALSE
  188. return 0;
  189. if (nTopIndex < nValueNum)
  190. nIndex = 1 ;
  191. else
  192. nIndex = nTopIndex - nValueNum +1;
  193. {
  194. va_start(vlist, cFormat);     
  195. while (cFormat[i] != '')
  196. {
  197. switch(cFormat[i])
  198. {
  199. case 'n'://返回值为数值形,Number,此时Lua只传递double形的值
  200. {
  201. pNumber = va_arg(vlist, double *);
  202. if (pNumber == NULL)
  203. return 0;
  204. if (Lua_IsNumber(L, nIndex ))
  205. {
  206. * pNumber = Lua_ValueToNumber(L, nIndex ++ );
  207. }
  208. else
  209. {
  210. // ScriptError(LUA_SCRIPT_NOT_NUMBER_ERROR);
  211. return 0;
  212. }
  213. }
  214. break;
  215. case 's'://字符串形
  216. {
  217. pStrPoint = va_arg(vlist, const char **);
  218. if (pStrPoint == NULL)
  219. return 0;
  220. if (Lua_IsString(L, nIndex))
  221. {
  222. pString = Lua_ValueToString(L, nIndex++);
  223. *pStrPoint = pString;
  224. }
  225. else
  226. {
  227. // ScriptError(LUA_SCRIPT_NOT_STRING_ERROR);
  228. return 0;
  229. }
  230. }
  231. break;
  232. }
  233. i ++;
  234. }
  235. va_end(vlist);      /* Reset variable arguments.      */
  236. }
  237. return 1;
  238. }