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(); }
newtRef protoREGEX_match(newtRefArg rcvr, newtRefArg str) { newtRefVar preg; newtRefVar r; if (NewtRefIsNIL(rcvr)) return kNewtRefUnbind; NcSetSlot(rcvr, NSSYM(_matchs), kNewtRefNIL); preg = NcGetSlot(rcvr, NSSYM(_preg)); if (NewtRefIsNIL(preg)) { protoREGEX_compile(rcvr); preg = NcGetSlot(rcvr, NSSYM(_preg)); if (NewtRefIsNIL(preg)) return kNewtRefNIL; } r = protoREGEX_regexec(preg, str); NcSetSlot(rcvr, NSSYM(_matchs), r); return r; }
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 NewtInitARGV(int argc, const char * argv[], int n) { newtRefVar exepath = kNewtRefUnbind; newtRefVar r; uint16_t j; uint16_t i; r = NewtMakeArray(kNewtRefUnbind, argc - n); NcSetSlot(GLOBALS, NSSYM0(_ARGV_), r); for (i = n, j = 0; i < argc; i++, j++) { NewtSetArraySlot(r, j, NewtMakeString(argv[i], true)); } #ifdef __WIN32__ { char sep; sep = NewtGetFileSeparator(); if (sep != '\\') { char * path; path = strdup(argv[0]); if (path) { replacechr(path, '\\', sep); exepath = NewtExpandPath(path); free(path); } else { exit(errno); } } } #endif if (NewtRefIsNIL(exepath)) exepath = NewtExpandPath(argv[0]); NcSetSlot(GLOBALS, NSSYM0(_EXEDIR_), NcDirName(exepath)); }
newtRef protoREGEX_cleanup(newtRefArg rcvr) { newtRefVar preg; if (NewtRefIsNIL(rcvr)) return kNewtRefUnbind; NcSetSlot(rcvr, NSSYM(_matchs), kNewtRefNIL); preg = NcGetSlot(rcvr, NSSYM(_preg)); if (NewtRefIsNotNIL(preg)) { protoREGEX_regfree(preg); NcSetSlot(rcvr, NSSYM(_preg), kNewtRefNIL); } return kNewtRefNIL; }
newtRef protoREGEX_compile(newtRefArg rcvr) { newtRefVar preg; if (NewtRefIsNIL(rcvr)) return kNewtRefUnbind; preg = protoREGEX_regcomp(NcGetSlot(rcvr, NSSYM(pattern)), NcGetSlot(rcvr, NSSYM(option))); return NcSetSlot(rcvr, NSSYM(_preg), preg); }
newtRef NcSetPath(newtRefArg r, newtRefArg p, newtRefArg v) { newtRefVar slot; newtRefVar target; target = NewtGetPath(r, p, &slot); if (target == kNewtRefUnbind) NewtThrow(kNErrOutOfBounds, r); if (NewtRefIsArray(target)) return NcSetArraySlot(target, slot, v); else return NcSetSlot(target, slot, v); }
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); }
newtRef NsDefNamedMP(newtRefArg rcvr, newtRefArg r, newtRefArg v) { newtRefVar sym; if (NewtRefIsNamedMP(r)) { sym = NewtMPToSymbol(r); } else if (NewtRefIsSymbol(r)) { sym = r; } else { return r; } return NcSetSlot(NAMED_MPS, sym, v); }
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)); }
newtRef NsSetGlobalVar(newtRefArg rcvr, newtRefArg r, newtRefArg v) { return NcSetSlot(GLOBALS, r, v); }
newtRef NsDefGlobalFn(newtRefArg rcvr, newtRefArg r, newtRefArg fn) { return NcSetSlot(GLOBAL_FNS, r, fn); }