動いた
月曜日に更新できなかったけれど、VS2008C++版のOsoScriptが、グダグダですが動きました。
ブログを読んでいる人はほとんどいないと思いますが、とりあえず、どこかに公開したいと思います。完成となる条件は設定していないので、順次作りかけ版を公開していくことになると思います。
起動時の簡単な説明
メインの呼び出しは下記のような感じです。oso.runファイルに起動時実行スクリプトファイル名が入っているので、その内容をOsoStartFileName配列に取り込んで、それをOsoFilenamw配列にセットしています。そして、OsoRun()という実行ルーチンを呼び出しています。OsoFilename配列には、OsoRun()が呼び出されたときに実行するスクリプトファイルが格納されます。
int _tmain(int argc, _TCHAR* argv[]) { //Osoの起動ファイル名を取得します。 //OsoSatrtFileName[]に取得したファイル名が入ります。 GetOsoStartFileName(); strcpy( (char*)OsoFilename, OsoStartFileName ); //実行関数を呼び出す while( true ){ OsoRun(); } while(true); return 0; }
そしで、呼ばれたOsoRun()は、下記のような感じです。
void OsoRun( void ) { char exeOsofile[32]; errno_t err; int fl; //実行するOsoファイルをexeOsofile[]に入れる。 strcpy( exeOsofile, (char*)OsoFilename ); //OsoFilename[]にOsoStartFileName[]を入れなおす。 strcpy( (char*)OsoFilename, OsoStartFileName ); //スクリプトファイルのオープン if( (err = fopen_s( &ExeFp,(const char*)exeOsofile,"rb" ))!=0 ){ printf( "exefile Open Error\n" ); return; } //変数の初期化 Henpos = 0; LocalHenStacPtr = 0; ScriptStacPtr = 0; TokenPos = 0; //関数テーブルのファイル名生成 fl = strlen( exeOsofile ); strcpy( OsoFncTblname, exeOsofile ); OsoFncTblname[fl-3] = 'f'; OsoFncTblname[fl-2] = 't'; OsoFncTblname[fl-1] = 'b'; //関数ファイル生成チェック if( ChkFuncTbl()==false ){ //関数ファイルを生成する CreateFuncTable( (char*)OsoFilename ); } //グローバル変数を読み込む SearchGlobal(); //スクリプト開始 exeFunc( (char*)"main" ); //スクリプト終了 fclose( ExeFp ); }
OsoRun()内部で、OsoFilename配列に格納されたスクリプトファイル名を実行するわけではなく、一度、exeOsofile配列に実行スクリプトファイル名をコピーして、exeOsofile配列を用いてファイルをopenしています。そして、スクリプト実行開始する前に、OsoFilename配列にOsoStartFileName配列の内容をコピーしています。無駄なことをしているように思いますが、実は、OsoFilename配列の内容はOsoScript内の命令で書き換えられるように実装しました。
このような二重構造にしておくと、main()関数にあるように、OsoRun()は無限ループしているので、スクリプトが終了したときに、再度、OsoRun()が呼び出されて、OsoFilename配列に入ったスクリプトが実行されることになり、スクリプト内でOsoFilenameにセットしたスクリプトが、次に実行されることになります。そして、OsoScriptが実行される前に、OsoFilenameの内容は、OsoStartFileNameの内容に書き戻しています。
この構造をとることによって、スクリプト内からスクリプトを呼び出せるという仕組みを作っています。
そして、スクリプト開始時に呼び出す関数は、'main'決め打ちです。'main'関数が無いとエラーで終了する予定ですが、エラー処理は、まだ、コーディングできていません。
プログラムの説明は、適当な順番で解説をしていこうと思います。次回は、下記変数について書きたいと思います。
//変数の初期化 Henpos = 0; LocalHenStacPtr = 0; ScriptStacPtr = 0; TokenPos = 0;
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム