void NewtInitEnv(int argc, const char * argv[], int n) { // シンボルテーブルの作成 SYM_TABLE = NewtMakeArray(kNewtRefUnbind, 0); NewtInitSYM(); // ルートフレームの作成 ROOT = NcMakeFrame(); // グローバル変数テーブルの作成 GLOBALS = NcMakeFrame(); // グローバル関数テーブルの作成 GLOBAL_FNS = NcMakeFrame(); // マジックポインタテーブルの作成 MAGIC_POINTERS = NewtMakeArray(kNewtRefUnbind, 0); // ルートフレームに各テーブルを格納 NcSetSlot(ROOT, NSSYM0(globals), GLOBALS); NcSetSlot(ROOT, NSSYM0(global_fns), GLOBAL_FNS); NcSetSlot(ROOT, NSSYM0(magic_pointers), MAGIC_POINTERS); NcSetSlot(ROOT, NSSYM0(sym_table), SYM_TABLE); #ifdef __NAMED_MAGIC_POINTER__ // 名前付マジックポインタテーブルの作成 NAMED_MPS = NcMakeFrame(); // ルートフレームに名前付マジックポインタテーブルの格納 NcSetSlot(ROOT, NSSYM0(named_mps), NAMED_MPS); #endif /* __NAMED_MAGIC_POINTER__ */ // 環境変数の初期化 NewtInitSysEnv(); // ARGV の初期化 NewtInitARGV(argc, argv, n); // バージョン情報の初期化 NewtInitVersInfo(); }
void NewtInitSysEnv(void) { struct { char * name; newtRefVar slot; const char * defaultValue; } envs[] = { {"NEWTLIB", NSSYM0(NEWTLIB), __LIBDIR__ ":."}, {"PLATFORM", NSSYM(PLATFORM), __PLATFORM__}, {"DYLIBSUFFIX", NSSYM(DYLIBSUFFIX), __DYLIBSUFFIX__}, {NULL, kNewtRefUnbind, NULL} }; newtRefVar env; newtRefVar proto; newtRefVar v; uint16_t i; env = NcMakeFrame(); proto = NcMakeFrame(); for (i = 0; envs[i].name != NULL; i++) { NcSetSlot(proto, envs[i].slot, NewtMakeString(envs[i].defaultValue, true)); } /* NEWTLIB is a special case, it can be overridden from the value in the global variables. */ v = NewtGetEnv("NEWTLIB"); if (NewtRefIsString(v)) { v = NcSplit(v, NewtMakeCharacter(':')); NcSetSlot(proto, NSSYM0(NEWTLIB), v); } else { newtRefVar default_newtlib_array[] = {NSSTR(__LIBDIR__), NSSTR(".")}; newtRefVar default_newtlib = NewtMakeArray2( kNewtRefNIL, sizeof(default_newtlib_array) / sizeof(newtRefVar), default_newtlib_array); NcSetSlot(proto, NSSYM0(NEWTLIB), default_newtlib); } NcSetSlot(env, NSSYM0(_proto), NewtPackLiteral(proto)); NcSetSlot(GLOBALS, NSSYM0(_ENV_), env); }
void protoREGEX_install(void) { newtRefVar r; r = NcMakeFrame(); NcSetSlot(r, NSSYM(Class), NSSYM(Regex)); // NcSetSlot(r, NSSYM(_gcScript), NewtMakeNativeFunc(MyCleanup, 0, "_gcScript()")); NcSetSlot(r, NSSYM(Compile), NewtMakeNativeFunc(protoREGEX_compile, 0, "Compile()")); NcSetSlot(r, NSSYM(Match), NewtMakeNativeFunc(protoREGEX_match, 1, "Match(str)")); NcSetSlot(r, NSSYM(Cleanup), NewtMakeNativeFunc(protoREGEX_cleanup, 0, "Cleanup()")); NcSetSlot(r, NSSYM(pattern), kNewtRefNIL); NcSetSlot(r, NSSYM(option), kNewtRefNIL); NcSetSlot(r, NSSYM(_preg), kNewtRefNIL); NcSetSlot(r, NSSYM(_matchs), kNewtRefNIL); NcDefMagicPointer(NSSYM(protoREGEX), r); }
void NewtInitVersInfo(void) { newtRefVar versInfo; versInfo = NcMakeFrame(); // プロダクト名 NcSetSlot(versInfo, NSSYM(name), NewtMakeString(NEWT_NAME, true)); // プロト番号 NcSetSlot(versInfo, NSSYM(proto), NewtMakeString(NEWT_PROTO, true)); // バージョン番号 NcSetSlot(versInfo, NSSYM(version), NewtMakeString(NEWT_VERSION, true)); // ビルド番号 NcSetSlot(versInfo, NSSYM(build), NewtMakeString(NEWT_BUILD, true)); // コピーライト NcSetSlot(versInfo, NSSYM(copyright), NewtMakeString(NEWT_COPYRIGHT, true)); // スタッフロール NcSetSlot(versInfo, NSSYM(staff), NewtMakeString(NEWT_STAFF, true)); // リードオンリーにしてグローバル変数に入れる NcSetSlot(GLOBALS, NSSYM(_VERSION_), NewtPackLiteral(versInfo)); }