徒然なる日々を送るソフトウェアデベロッパーの記録(2)

技術上思ったことや感じたことを気ままに記録していくブログです。さくらから移設しました。

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バイトの長さ>

マジックワードは 'm', 's', 'c', '2' とします。
数値はリトルエンディアンを採用します。

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 を使用することにします。

実装言語は C++ を使用

トークンの取り出しやすさやハッシュ型マップのサポートを考えて C++ 2011 で
記述することにします。

次回はいよいよ実装を考えます。まず、スクリプト部分について検討し、
ある程度固まったら http サーバの実装に入ります。