개요

Translator는 모든 스크립트를 필터링하는 존재다. (참고: 고스트모듈간의상관관계)

모든 스크립트는 반드시 Translator를 통과한다. 이 때, Translator는 받았던 스크립트와 다른 스크립트를 돌려주는 것으로 스크립트를 수정할 수 있다. 주된 용도는 다음과 같다.

home
  +-ghost
      +-misuzu
          +-ghost
              +-alias.txt
              +-makoto.dll

MAKOTO/2.0

Traslator의 실체는 request 함수를 export 하는 DLL 파일이다.

기본적으로 모든 스크립트가 이 DLL을 통과한 뒤 말풍선에 표시된다. 내부에서 무엇을 하는가는 완전 자유다. 어떤 변환도 하지 않고 되돌리면「아무것도 하지 않는」Translator가 되는것이다.

{{{ * 함수 선언 extern "C" declspec(dllexport) HGLOBAL cdecl request(HGLOBAL h, long *len); function request(h: hglobal; var len: longint): hglobal; export; cdecl; }}}

{{{ * 리퀘스트의 예 EXECUTE MAKOTO/2.0 Sender: embryo String: \0\s0이것은 펜입니다.\e Charset: Shift_JIS }}}

{{{ * 처리 결과의 예 MAKOTO/2.0 200 OK String: \0\s0이것은 펜이다.\e Charset: Shift_JIS }}}

리퀘스트는 GMEM_FIXED, 즉 단순한 포인터로 넘겨진다. 리퀘스트는 Null-Terminated 문자열 (주: 바이트코드 0x00 으로 끝나는 문자열)이 되며, 문자열의 길이는 len으로 넘겨진다. DLL은 여기에서 문자열을 추출해, 문자열을 수정할 필요가 있으면 핸들 h 를 해방(Free)하고 문자열을 적당히 변경한뒤, len 을 다시 세팅하고 새로운 GMEM_FIXED 로 메모리를 할당(Allocate)받아 200 OK를 되돌린다. 문자열의 수정이 불필요한 경우는 핸들을 해방하지 않고 스테이터스 코드 204 No Content 를 돌려주면 된다.

DLL을 메모리에 처음 로드 및 언로드할 때 아래의 함수가 호출된다.

extern "C" __declspec(dllexport) BOOL __cdecl load(HGLOBAL h, long len);
function load(h: thandle; len: longint): boolean; export; cdecl;

extern "C" __declspec(dllexport) BOOL __cdecl unload();
function unload: boolean; export; cdecl;

load 에서는 제 1 인수에 DLL 의 디렉토리 경로가 넘겨진다. 데이터 파일등을 가지는 경우는 여기에서 Currnet 디렉토리를 얻어서, 그곳에 데이터 파일을 만든다(즉 그 자신의 디렉토리에 모든 구성파일들을 넣는다).

경로가 필요 없어도 핸들은 해방할 필요가 있다.

반환값은 BOOL (성공시 TRUE, 실패시 FALSE) 이지만 embryo 는 이 값을 보지 않는다 (어떤 값이 되돌아와도 처리를 속행한다).

함수는 필요하든 그렇지 않든 관계없이 모두 export 해야한다. 부족하면 폭주한다.

스테이터스 코드

스테이터스 코드

서버가 반환해야 할 스테이터스 코드는 다음과 같다.

2xx - 처리 완료

200 OK         정상적으로 종료했다
204 No Content 정상적으로 종료했지만, 반환할 데이터는 없다

4xx - 리퀘스트 에러

400 Bad Request 리퀘스트 미비 (형식에 맞지 않는다거나)

5xx - 서버 에러

500 Internal Server Error 서버내에서 에러가 발생했다

앨리어스(alias)

home
 +-ghost
    +-naru
       +-ghost
          +-master
             +-alias.txt
             +-makop-.dll

앨리어스(alias)를 설정하는 것으로, DLL 파일명을 자신이 원하는 이름으로 사용할 수 있다.

alias.txt 의 포맷은 다음과 같다.

makoto, makop-.dll

예를 들면, 위와 같이 기술하는 것으로, embryo는 makoto.dll 대신에 makop-.dll 을 사용한다.

엔트리는 생략 가능하다. 생략했을 경우 디폴트값(makoto.dll)이 사용된다.

네스트 (중첩)

home
 +-ghost
    +-naru
       +-ghost
          +-master
             +-alias.txt
             +-makop-.dll
             +-makop-2.dll

앨리어스(alias)에 복수의 파일을 정의하는 것으로, 2개 이상의 makoto를 사용할 수 있다.

네스트를 실시하는 경우, alias.txt 에 다음과 같이 기술한다.

makoto,[makop-.dll, makop-2.dll]

이 경우, 스크립트는 makop-.dll 과 makop-2.dll 을 차례로 통과한 뒤 결과가 출력된다.


으음.. 써놓긴 했지만 무슨말인지 이해가 안되는 말도 있네요.. 하아. 자 누가 좀 고쳐주세요.. -- iguana

Nanika: SpecMakoto (2008-08-10 19:56:18에 localhost가(이) 마지막으로 수정)