sm4.c

最終更新:2009/11/18

sm4.c

001: /* sm4.c
002:  * SpiderMonkey を C プログラムから使う例
003:  * スクリプトファイルで定義した関数を C プログラムの中で使用する。
004:  * ・コマンドライン引数で JavaScript のファイル名を指定する。
005:  * ファイルの中で定義した関数 foo にコマンドライン引数で指定した値を
006:  * 引数として適用する。
007:  * ・foo は整数値を引数としてとり、整数値を返す関数とする。
008:  * int foo(int)
009:  * ・実行例
010:  * % sm4 foo.js 6
011:  * のように実行した場合は、foo.js 内で定義した関数 foo に引数 6 を適用する。
012:  */
013: 
014: #define USAGE "Usage: sm4 <script_file_of_foo> <arg_of_foo>"
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:   int foo_arg = 0;
031:   
032:   if (ac < 3) {
033:     fprintf(stderr, "%s\n", USAGE);
034:     error_flag = 1;
035:     goto _FINALLY_;
036:   }
037:   filename = av[1];
038:   foo_arg = atoi(av[2]);
039:   
040:   /* 初期化 */
041: 
042:   /* プロセス単位でランタイムを生成 */
043:   if (!my_js_rt_init()) {
044:     error_flag = 1;
045:     goto _FINALLY_;
046:   }
047:   
048:   /* スレッド単位でコンテクスト生成 */
049:   jsctx = my_js_ctx_init();
050:   if (!jsctx) {
051:     error_flag = 1;
052:     goto _FINALLY_;
053:   }
054:   
055:   /* スクリプトの実行 */
056:   
057:   {
058:     JSScript *js_script = NULL;
059:     jsval rval;
060:     if(!my_js_execute_script(jsctx, filename, &js_script, &rval)) {
061:       fprintf(stderr, "ERROR: execute_script ");
062:       error_flag = 1;
063:       goto _FINALLY_;
064:     }
065:     if (js_script) {
066:       //JS_MaybeGC(jsctx);
067:       JS_DestroyScript(jsctx, js_script); /* このスクリプトは再利用しない */
068:     }
069:   }
070:   
071:   /* 関数 foo の実行 */
072:   {
073:     int ret = 0;
074:     int args[1];
075:     args[0] = foo_arg;
076:     if (! my_js_call_function_IA_I(jsctx, FUNC_NAME, 1, args, &ret)) {
077:       fprintf(stderr, "ERROR: call_function ");
078:       error_flag = 1;
079:       goto _FINALLY_;
080:     }
081:     printf("%s(%d)=%d\n", FUNC_NAME, args[0], ret);
082:   }
083:   
084:   _FINALLY_:
085:   
086:   /* JSContext と JSRuntime リソースの解放 */
087:   if (jsctx) {
088:     my_js_ctx_clear(jsctx);
089:     jsctx = NULL;
090:   }
091: 
092:   my_js_rt_clear();
093: 
094:   if (error_flag) {
095:     fprintf(stderr, "failed.\n");
096:     return 1;
097:   }
098: 
099:   return 0;
100: } /* End of main */
Copyright (C) KAKU PROJECT (2009)KAKU PROJECT (2009)