// feeds one readline() at a time static ekU32 fileIterator(struct ekContext *E, ekU32 argCount) { ekFrame *frame = ekArrayTop(E, &E->frames); ekValue *fileVal; ekValue *chompVal; ekFile *file; ekAssert(frame->closure && frame->closure->closureVars); fileVal = ekMapGetS2P(E, frame->closure->closureVars, "file"); chompVal = ekMapGetS2P(E, frame->closure->closureVars, "chomp"); ekAssert(argCount == 0); ekContextPopValues(E, argCount); file = (ekFile *)fileVal->ptrVal; switchState(E, file, EFS_READ); ekContextReturn(E, readLineInternal(E, file, chompVal->intVal)); }
static ekU32 regexGMatchIterator(struct ekContext * E, ekU32 argCount) { ekFrame * frame = ekArrayTop(E, &E->frames); ekValue * regexValue; ekRegex * regex; ekValue * results; ekAssert(frame->closure && frame->closure->closureVars); regexValue = ekMapGetS2P(E, frame->closure->closureVars, "regex"); regex = (ekRegex *)regexValue->ptrVal; ekAssert(argCount == 0); ekContextPopValues(E, argCount); results = ekValueCreateArray(E); if (!ekRegexMatchNext(E, regex, results)) { results = ekValueNullPtr; } ekContextReturn(E, results); }