이 내용은 2003/1/18 기준으로 쓰여졌습니다. 최신 내용은 본가에서 얻으실 수 있습니다.
개요
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
고쳤습니다.. -- whoami
으핫.. null terminated... 확신이 안서서 그냥 놔뒀는데... 어떻게 저게 누루.. 가 되는것인가.. 쿨럭 -- iguana
