sm5.c

最終更新:2009/11/18

sm5.c

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 */
Copyright (C) KAKU PROJECT (2009)KAKU PROJECT (2009)