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; }
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 NsPrimClassOf(newtRefArg rcvr, newtRefArg r) { newtRefVar klass; if (NewtRefIsPointer(r)) { switch (NewtGetRefType(r, true)) { case kNewtFrame: klass = NSSYM0(frame); break; case kNewtArray: klass = NSSYM0(array); break; default: klass = NSSYM0(binary); break; } } else { klass = NSSYM(immediate); } return klass; }
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); }
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; }
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)); }