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) |