newtRef NsSplit(newtRefArg rcvr, newtRefArg r, newtRefArg sep) { newtRefVar result; if (! NewtRefIsString(r)) return NewtThrow(kNErrNotAString, r); switch (NewtGetRefType(sep, true)) { case kNewtCharacter: { newtRefVar v; char * next; char * s; int c; s = NewtRefToString(r); c = NewtRefToCharacter(sep); result = NewtMakeArray(kNewtRefUnbind, 0); while (*s) { next = strchr(s, c); if (next == NULL) break; v = NewtMakeString2(s, next - s, false); NcAddArraySlot(result, v); s = next + 1; } if (s == NewtRefToString(r)) v = r; else v = NSSTR(s); NcAddArraySlot(result, v); } break; default: { newtRefVar initObj[] = {r}; result = NewtMakeArray2(kNewtRefNIL, sizeof(initObj) / sizeof(newtRefVar), initObj); } break; } return result; }
newtRef protoREGEX_regexec(newtRefArg preg, newtRefArg str) { newtRefVar substr; newtRefVar r; regmatch_t pmatch[10]; size_t nmatch; char * src; int eflags = 0; int err; int i; if (NewtRefIsNIL(str)) return kNewtRefNIL; if (! protoREGEX_refIsPreg(preg)) return kNewtRefUnbind; if (! NewtRefIsString(str)) return NewtThrow(kNErrNotAString, str); nmatch = sizeof(pmatch) / sizeof(regmatch_t); src = NewtRefToString(str); err = regexec((regex_t*)NewtRefToBinary(preg), src, nmatch, pmatch, eflags); if (err != 0) return kNewtRefNIL; r = NewtMakeArray(kNewtRefUnbind, nmatch); for (i = 0; i < nmatch; i++) { if (pmatch[i].rm_so != -1) { substr = NewtMakeString2(src + pmatch[i].rm_so, pmatch[i].rm_eo - pmatch[i].rm_so, false); NewtSetArraySlot(r, i, substr); } } return r; }