sm5.c
最終更新:2009/11/18
001: /* sm5.c 002: * SpiderMonkey を C プログラムから使う例 003: * スクリプトファイルで定義した関数を C プログラムの中で使用する。 004: * ・コマンドライン引数で JavaScript のファイル名を指定する。 005: * ファイルの中で定義した関数 foo にコマンドライン引数で指定した値を 006: * 引数として適用する。 007: * ・foo は文字列を二つ引数としてとり、文字列を返す関数とする。 008: * char* foo(char*, char*) 009: * ・実行例 010: * % sm5 foo.js "str1" "str2" 011: * のように実行した場合は、foo.js 内で定義した関数 foo に引数 "str1", "str2" を適用する。 012: */ 013: 014: #define USAGE "Usage: sm5 <script_file_of_foo> <arg1> <arg2>" 015: 016: #define FUNC_NAME "foo" 017: 018: #include <stdio.h> 019: #include <stdlib.h> 020: #include <string.h> 021: #include "myjs.h" 022: 023: int main(int ac, char **av) 024: { 025: int error_flag = 0; 026: 027: JSContext *jsctx = NULL; 028: 029: char *filename = NULL; 030: char *foo_arg1 = NULL; 031: char *foo_arg2 = NULL; 032: 033: if (ac < 4) { 034: fprintf(stderr, "%s\n", USAGE); 035: error_flag = 1; 036: goto _FINALLY_; 037: } 038: filename = av[1]; 039: foo_arg1 = av[2]; 040: foo_arg2 = av[3]; 041: 042: /* 初期化 */ 043: 044: /* プロセス単位でランタイムを生成 */ 045: if (!my_js_rt_init()) { 046: error_flag = 1; 047: goto _FINALLY_; 048: } 049: 050: /* スレッド単位でコンテクスト生成 */ 051: jsctx = my_js_ctx_init(); 052: if (!jsctx) { 053: error_flag = 1; 054: goto _FINALLY_; 055: } 056: 057: /* スクリプトの実行 */ 058: 059: { 060: JSScript *js_script = NULL; 061: jsval rval; 062: if(!my_js_execute_script(jsctx, filename, &js_script, &rval)) { 063: fprintf(stderr, "ERROR: execute_script "); 064: error_flag = 1; 065: goto _FINALLY_; 066: } 067: if (js_script) { 068: //JS_MaybeGC(jsctx); 069: JS_DestroyScript(jsctx, js_script); /* このスクリプトは再利用しない */ 070: } 071: } 072: 073: /* 関数 foo の実行 */ 074: { 075: char *ret = NULL; 076: char* args[2]; 077: args[0] = foo_arg1; 078: args[1] = foo_arg2; 079: if (! my_js_call_function_SA_S(jsctx, FUNC_NAME, 2, args, &ret)) { 080: fprintf(stderr, "ERROR: call_function "); 081: error_flag = 1; 082: goto _FINALLY_; 083: } 084: printf("%s(%s,%s)=%s\n", FUNC_NAME, args[0], args[1], ret); 085: } 086: 087: _FINALLY_: 088: 089: /* JSContext と JSRuntime リソースの解放 */ 090: if (jsctx) { 091: my_js_ctx_clear(jsctx); 092: jsctx = NULL; 093: } 094: 095: my_js_rt_clear(); 096: 097: if (error_flag) { 098: fprintf(stderr, "failed.\n"); 099: return 1; 100: } 101: 102: return 0; 103: } /* End of main */
KAKU PROJECT (2009) |