-- 일단은 책에 있는 내용을 거의 그대로 타이핑했습니다..-_-;  이 부분때문에 이 책을 구입했다고 -- 해도 과언이 아니기때문에....;; 통합부분과 연동부분만 책의 내용으로 타이핑예정입니다..

 

--[[

루아 배포판을 하나의 라이브러리로 컴파일 해두면 프로젝트가 좀 더 깔끔해진다.

루아 소스코드를 응용프로그램과 분리할 수있으므로 루아 소스 코드를 갱신 수정한다고 해도 응용 프로그램을 다시 컴파일 할 필요가 없으며 마찬가지로 응용 프로그램을 완전히 다시 빌드한다고 하더라도 루아 소스 코드는 다시 컴파일할 필요가 없다.  더 나아가서, 대부분의 프로젝트는 루아 API기능성의 일부만을 사용하는데 그런 기능성을 클래스로 추상화 한다면 루아의 초기화나 종료, 연동에 관련된 번잡한 부분을 숨길수 있다.  여기서 소개할 cLua 클래스가 그런의도로 만들어진 것이다.  밑은 cLua 클래스의 정의이다.

--]]

--cLua헤더

 

struct lua_State;

#define LuaGlue extern "C" int
extern "C" {
typedef int (*LuaFunctionType)(struct lua_State *pLuaState);
};

class cLua
{
public:
 cLua();
 virtual ~cLua();

 bool  RunScript(const char *pFilename);
 bool  RunString(const char *pCommand);
 const char *GetErrorString(void);
 bool  AddFunction(const char *pFunctionName, LuaFunctionType pFunction);
 const char *GetStringArgument(int num, const char *pDefault=NULL);
 double  GetNumberArgument(int num, double dDefault=0.0);
 void  PushString(const char *pString);
 void  PushNumber(double value);

 void  SetErrorHandler(void(*pErrHandler)(const char *pError)) {m_pErrorHandler = pErrHandler;}

 lua_State *GetScriptContext(void)  {return m_pScriptContext;}

private:
 lua_State *m_pScriptContext;
 void(*m_pErrorHandler)(const char *pError);
};
--[[

생성자는 루아 환경을 열고 소멸자는 그것을 닫는다.  메서드 RunString 과 RunScript는 각각 루아 스크립트 코드를 담은 문자열 또는 파일을 실행한다.   그 외의 메서드들은 루아글루 함수를 정의하거나, 루아글루 함수에 주어진 인수들을 얻거나, 루아 글루 함수에서 루아로 반환값을 돌려주는 작업을 좀더 편하게 수행하기 위한것들이다.

밑은 cLua클래스를 이용하도록 갱신된 콘솔프로그램이다.  코드가 훨씬작고 간단해졌음을 알 수 있다.

--]]

//갱신된 콘솔 프로그램..

//제한된 기능을 가진 간단한 루아 콘솔

//cLua 클래스와 루아 라이브러리를 사용한다.

//표준 헤더들을 포함한다.
#include <stdio.h>
#include <string.h>
#include <cLua.h>

LuaGlue _Version(lua_State *L)
{
 puts("This is Version 2.0 of the Console Program");
 return 0;
}

char gpCommandBuffer[254];

const char *GetCommand(void)
{
 printf("Ready> ");
 return gets(gpCommandBuffer);
 puts("\n");
}

void main(void)
{
//프로그램정보와 간단한 사용법을 출력
 puts("Lua Console (c) 2004 Charles River Media");
 puts("Enter Lua commands at the prompt, [QUIT] to exit\n\n");

 cLua *pLua = new cLua;

 pLua->AddFunction("Version", _Version);

//명령문을 반복적으로 처리한다.
 const char *pCommand = GetCommand();
 while(stricmp(pCommand, "QUIT") != 0)
 {
  // 문자열을 cLua로 전달한다.

  if(!pLua->RunString(pCommand))
  {
   printf("ERROR:%s\n", pLua->GetErrorString());
  }

  // 다음 명령문을 얻는다.

  pCommand = GetCommand();
 }
 
 delete pLua;
}

--[[
이제는 루아헤더들을 포함하지 않아도 된다. cLua.h만 포함하면 된다.  그리고 루아 글루함수 _Version의 서명이 LuaGlue 형식 덕분에 짧아졌다.  루아 환경을 열고 닫는 작업은 cLua 객체의 생성자와 소멸자에 의해 자동적으로 처리된다.  객체를 생성할때 루아 환경이 열리고 파괴할때 환경이 닫힌다. cLua::AddFunction은 루아 글루 함수Version을 추가한다.  등록할 함수가 많은 경우에는 원래의 예제처럼 자료구조와 루프를 이용하는것이 편할것이다.  cLua::Runstring은 문자열을 루아로 적재하고 실행한다. 루아와의 연동에 관련된 다소복잡한 과정을 이런 메서드들 안에 숨겨둠으로써, 최종적인 코드가 매우 깔끔하고 읽기 쉬워졌다.

--]]

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스

댓글을 달아 주세요