newtRef NcFullLookupFrame(newtRefArg start, newtRefArg name) { newtRefVar current; newtRefVar left = start; if (! NewtRefIsFrame(start)) return kNewtRefUnbind; while (NewtRefIsNotNIL(left)) { current = left; while (NewtRefIsNotNIL(current)) { current = NcResolveMagicPointer(current); if (NewtRefIsMagicPointer(current)) return kNewtRefUnbind; if (NewtHasSlot(current, name)) return current; current = NcGetSlot(current, NSSYM0(_proto)); } left = NcGetSlot(left, NSSYM0(_parent)); } return kNewtRefUnbind; }
newtRef NsOr(newtRefArg rcvr, newtRefArg r1, newtRefArg r2) { bool result; result = (NewtRefIsNotNIL(r1) || NewtRefIsNotNIL(r2)); return NewtMakeBoolean(result); }
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 NcLexicalLookup(newtRefArg start, newtRef name) { newtRefVar current = start; while (NewtRefIsNotNIL(current)) { current = NcResolveMagicPointer(current); if (NewtRefIsMagicPointer(current)) return kNewtRefUnbind; if (NewtHasSlot(current, name)) return NcGetSlot(current, name); current = NcGetSlot(current, NSSYM0(_nextArgFrame)); } return kNewtRefUnbind; }
newtRef NewtParamStr(char * baseStr, size_t baseStrLen, newtRefArg paramStrArray, bool ifthen) { newtRefVar dstStr; newtRefVar r; size_t fpos = 0; size_t fst = 0; size_t len; size_t n; size_t truePos; size_t trueLen; size_t falsePos; size_t falseLen; char * found; char c; dstStr = NewtMakeString("", false); do { found = memchr(&baseStr[fst], '^', baseStrLen - fst); if (found == NULL) break; c = found[1]; len = found - (baseStr + fpos); NewtStrCat2(dstStr, &baseStr[fpos], len); fpos += len; fst = fpos + 1; if ('0' <= c && c <= '9') { fpos += 2; fst = fpos; r = NewtGetArraySlot(paramStrArray, c - '0'); if (NewtRefIsNotNIL(r)) { NcStrCat(dstStr, r); } } else if (ifthen && c == '?') { c = found[2]; if ('0' <= c && c <= '9') { n = c - '0'; truePos = fpos + 3; found = memchr(&baseStr[truePos], '|', baseStrLen - truePos); if (found != NULL) { falsePos = found + 1 - baseStr; trueLen = falsePos - truePos - 1; found = memchr(&baseStr[falsePos], '|', baseStrLen - falsePos); if (found != NULL) { fpos = found + 1 - baseStr; } else { fpos = baseStrLen; } falseLen = fpos - falsePos - 1; } else { trueLen = baseStrLen - truePos; falsePos = baseStrLen; falseLen = 0; fpos = baseStrLen; } fst = fpos; r = NewtGetArraySlot(paramStrArray, n); if (NewtRefIsNotNIL(r)) { r = NewtParamStr(&baseStr[truePos], trueLen, paramStrArray, false); NcStrCat(dstStr, r); } else { if (falsePos == baseStrLen) break; r = NewtParamStr(&baseStr[falsePos], falseLen, paramStrArray, false); NcStrCat(dstStr, r); } } } } while(true); len = baseStrLen - fpos; if (0 < len) { NewtStrCat2(dstStr, &baseStr[fpos], len); } return dstStr; }