최상단 광고

2012년 4월 11일 수요일

LUA Script C/C++에서 로드하기 TIP


Text로 작성한 LUA Script 같은경우 로딩시에 아래와 같은 방법으로 로드 합니다.

< 제가 사용하는 방법 >
void OpenLuaScript(char *filename)
{
   FILE *fp;
   int filesize = 0;
   fp = fopen(filename,"rb");

   filesize = _filelength(fp->_file);

   m_buffer = new char [filesize];
   fread(m_buffer,filesize,1,fp);
   fclose(fp);

   int ret = lua_dobuffer( (lua_State *) m_luaState, (const char *)
   m_buffer, filesize, filename );

   assert( ret != LUA_ERRMEM );
   if ( ret == LUA_ERRSYNTAX ) return;

   delete [] m_buffer;
   m_buffer = NULL;
}

만일 최종으로 Data를 Pack한다거나 스크립트 파일을 은폐 하고 싶을 경우 일반적인
Text파일 스크립일 경우 문제가 생기죠, 특히 Lua의 Require를 사용하여 여러 파일로
스크립을 작성한경우 (다들 사용하실꺼라 믿습니다만..) 더욱 문제가 될꺼라 생각 합니다.
스크립 같은경우 일반 사용자가 수정을 가하게 되면 많은 부작용을 만들기 때문에
일반 사용자에게 노출시킨다는것은 위험 천만이죠. 게다가 Text로 만든 Script파일을
Pack data에 넣을 경우 Require 문장이 정확히 작동 할것이라는 보장도 없으므로
(문론 Lua Core를 고쳐서 작성하거나 하나의 파일로 만들면 가능하겠지만.)

그래서 방법을 생각하던중 Luac라는 실행파일을 발견 했습니다. Luac는 Lua Script를
Binary Format으로 바꾸어주는 (일종의 컴파일이라고 해야하나요??) 프로그램입니다.
Luac를 사용하면 여러개의 Text Script를 하나로 바꾸어줄뿐만 아니라, Format을 Binary로
바꾸어 주기 때문에 일반 사용자들이 내용을 수정하는데에 어렵게 합니다.

그럼 사용법은 다음과 같습니다.

luac: no input files given
usage: luac [options] [filenames].  Available options are:
  -        process stdin
  -l       list
  -o name  output to file `name' (default is "luac.out")
  -p       parse only
  -s       strip debug information
  -v       show version information
  --       stop handling options

예) test1.lua , test2.lua를 Binary로 바뀐 test.script로 바꿀경우
luac -s -o test.script test1.lua test2.lua
이렇게 하면 test.script 파일이 나옵니다. (-s 옵션은 Debug 정보를 넣느냐 마느냐..)
그럼 이 작업을 통하여 나온 test.script는 어떻게 사용하는가? 처음에 보여주었던 방법과
동일하게 load 하면 문제 없이 작동합니다.
예) OpenLuaScript("test.script");
Pack data에서 얻을경우에는 위의 함수를 약간 수정하여 Pack으로 부터 Load된
Data Buffer를 넘기는 방법으로 하면 되겠죠?

아주 간단한 Tip 입니다만 처음으로 Lua사용하시는 분들은 궁금해 하셨을 껍니다.
그럼 도움 되셨기를..

* Luac를 사용하지 않고 LuaIDE를 통하여 컴파일 하는 방법도 있습니다만,
어짜피 LuaIDE또한 Luac를 사용하기 때문에 생략합니다. :) 

댓글 없음: