minosys script を作ろう (3)
おあずけになっていたサーバの仕様です。
拡張子
.minosys という拡張子のファイルを見つけたら minosys script ファイルだと思うことにします。
パッケージを import している場合もサーチパス上に指定されたファイルが存在していれば
minosys script だと思うことにします。例えば import "file"; だったら file.msc という
ファイルがサーチパス上にあればそれを開きます。
スクリプトパッケージとバイナリパッケージ
バイナリパッケージとは、dlopen できてかつ start というシンボルが定義されている
ファイルだと定義します。start 関数は
int start(void **pret, void *engine, const char *funcname, void *args);
で定義されます。pret は戻り値を返すためのポインタ、engine は実行環境、
funcname は呼び出し関数名、args は引数です。
バイナリパッケージでないパッケージは minosys script ファイルと解釈されます。
パッケージの循環参照禁止
パッケージを import していったとき、元のパッケージが指定されていた場合に
パッケージの import が解決できないという問題が発生します。
今回は「パッケージは一度しか評価しない」というルールを導入することで
問題解決を図ります。例えば、
パッケージ pack1 が pack2 を import し、pack2 が pack1 をインポートしていた場合、
pack2 のインポートは評価されません。
archive ファイル対応
独自の archive ファイルを導入します。別に zip や tar でもよいのですが、
単純なフォーマットを採用したいと考えました。
<4バイトのマジックワード> <4バイトのテーブルサイズ> <文字列への4バイトポインタ><4バイトの長さ> <バイナリへの4バイトポインタ><4バイトの長さ>
http サーバ
HTTP サーバとして最低限の機能を提供します。
.html で HTML ファイルを、.txt でテキストファイルを、
.jpg, .gif, .png で画像ファイルを出力します。
AcceptRange をサポートしてファイルの部分ダウンロードを可能にします。
application/x-www-form-urlencoded および multipart/form-data を
サポートし、フォーム入力可能にします。
イベントドリブンな関数定義
minosys script を読み込むと init 関数をまず実行します。
その後、http GET メソッドが呼び出されていれば get 関数を
POST メソッドが呼び出されていれば post 関数を実行します。
get 関数の仕様
function get($hash) { }
$hash は <キー>=<値> という辞書型配列です。
ただし、checkbox は例外で、<キー>=<値の配列>となります。
post 関数の仕様
function post($hash, $file) { }
$hash は get 関数と同じです。$file はファイルアップロードされた場合、
以下の辞書型配列の配列となります。
"localfile": ローカルファイル名
"filename": ファイル名
"size": ファイルサイズ
"tmpfile": 一時ファイル名(フルパス)
ファイルアップロードされないことが分かっている場合は省略可能です。
また一時ファイルは post 呼び出し後削除されるので、必要な場合はコピーして
おく必要があります。
ポート番号
18080 を使用することにします。