CGI State: None
document

MAKOTO/1.0
MAKOTO/2.0

ステータスコード

エイリアス
ネスト

概要


トランスレータは全てのスクリプトをフィルタする存在です。

全てのスクリプトは必ずトランスレータを通過します。このとき、トランスレータは受け取ったものと異なるスクリプトを返すことでスクリプトを改竄することができます。主な用途は以下のようなものが考えられます。


  • (主にファイル等への)リダイレクション
  • 口調変換
  • 翻訳
  • 発声


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

  • MAKOTO/2.0


    トランスレータの実体は request 関数をエクスポートする DLL です。

    基本的に全てのスクリプトがこの DLL を通過してから発言されます。内部で何をするかは全くの自由です。何の変換もせずに戻せば「何もしない」トランスレータということになります。


    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、即ち単なるポインタで渡されます。リクエストはヌルターミネート文字列ではなく、メモリ長は len で求められます。DLL はここから文字列を取得し、文字列にタッチする必要があるならハンドルを解放、適宜変更を行い、正しい len をセットし直し、新しい GMEM_FIXED で 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 のディレクトリパスが渡されます。データファイル等を持つ場合はここからカレントディレクトリを取得し、そこにデータファイルを作って下さい(つまり自ディレクトリ内に全構成ファイルを納めて下さい)。

    パスが必要なくてもハンドルは解放する必要があります。

    戻り値は bool ですが現在のところ embryo はこの値を見ていません(何が返ってきても処理を続行します)。


    関数は中身を実装するか否かに関わらず必ず全てエクスポートして下さい。足りなければ暴走します。

    ステータスコード


  • ステータスコード


    サーバが返すべきステータスコードは以下の通りです。


    2xx - 処理完了


    200 OK
    正常に終了した
    204 No Content
    正常に終了したが、返すべきデータはない


    4xx - リクエストエラー


    400 Bad Request
    リクエスト不備


    5xx - サーバエラー


    500 Internal Server Error
    サーバ内でエラーが発生した

  • エイリアス


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

    エイリアスを設定することで、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
    

    エイリアスに複数のファイルを定義することにより、2つ以上の makoto を通過させることができます。

    ネストを行う場合、alias.txt に以下のように記述します。


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


    この場合、スクリプトは makop-.dll と makop-2.dll を順番に通過し、その結果が最終出力されます。

    戻る