FskErr FskSSLWrite(void *a, const void *buf, int *bufLen) { FskSSL *fssl = a; FskErr err = kFskErrNone; int len = *bufLen; if (fssl->skt == NULL) return kFskErrOperationFailed; if (buf == NULL || len == 0) return kFskErrNone; xsBeginHost(fssl->vm->the); xsTry { xsVars(1); xsCall1_noResult(fssl->socket, xsID("attachData"), xsHostData(fssl->skt)); xsVar(0) = xsNew1(xsGlobal, xsID("Chunk"), xsInteger(len)); FskMemCopy(xsGetHostData(xsVar(0)), buf, len); xsResult = xsCall2(fssl->ssl, xsID("write"), fssl->socket, xsVar(0)); *bufLen = xsToInteger(xsResult); if (*bufLen == 0) err = kFskErrNoData; xsCall0_noResult(xsVar(0), xsID("free")); } xsCatch { if (xsHas(xsException, xsID("code"))) err = xsToInteger(xsGet(xsException, xsID("code"))); if (err == kFskErrNone) err = kFskErrOperationFailed; } xsEndHost(fssl->vm->the); return err; }
FskErr FskSSLRead(void *a, void *buf, int *bufLen) { FskSSL *fssl = a; FskErr err = kFskErrNone; int len = *bufLen, nread; if (fssl->skt == NULL) return kFskErrOperationFailed; xsBeginHost(fssl->vm->the); xsTry { xsCall1_noResult(fssl->socket, xsID("attachData"), xsHostData(fssl->skt)); xsResult = xsCall2(fssl->ssl, xsID("read"), fssl->socket, xsInteger(len)); if (xsTest(xsResult)) { nread = xsToInteger(xsGet(xsResult, xsID("length"))); if (nread > len) nread = len; FskMemCopy(buf, xsGetHostData(xsResult), nread); xsCall0_noResult(xsResult, xsID("free")); *bufLen = nread; err = nread == 0 ? kFskErrNoData: kFskErrNone; } else err = kFskErrConnectionClosed; } xsCatch { if (xsHas(xsException, xsID("code"))) err = xsToInteger(xsGet(xsException, xsID("code"))); if (err == kFskErrNone) err = kFskErrOperationFailed; } xsEndHost(fssl->vm->the); return err; }
void fxParse(xsMachine* the, void* theStream, xsGetter theGetter, xsStringValue thePath, xsIntegerValue theLine, xsFlag theFlag) { xsStreamGetter streamGetter; xsSlot* stack = the->stack; xsIntegerValue c = xsToInteger(stack[0]); stack[c] = xsGet(xsGet(xsGlobal, xsID("xs")), xsID("infoset")); stack[c - 1] = xsNewHostObject(NULL); streamGetter.stream = theStream; streamGetter.getter = theGetter; xsSetHostData(stack[c - 1], &streamGetter); if (thePath && theLine) stack[c - 2] = xsCall3(stack[c], xsID("scan"), stack[c - 1], xsString(thePath), xsInteger(theLine)); else if (thePath) stack[c - 2] = xsCall2(stack[c], xsID("scan"), stack[c - 1], xsString(thePath)); else stack[c - 2] = xsCall1(stack[c], xsID("scan"), stack[c - 1]); stack[c] = xsCall2(stack[c], xsID("parse"), stack[c - 2], xsInteger(theFlag)); the->stack = stack + c; }
void xs_parse(xsMachine* the) { xsIntegerValue c = xsToInteger(xsArgc); xsVars(2); if (c < 1) xsSyntaxError("no buffer"); xsVar(0) = xsGet(xsGet(xsGlobal, xsID_xs), xsID_infoset); if (c > 3) xsVar(1) = xsCall3(xsVar(0), xsID_scan, xsArg(0), xsArg(2), xsArg(3)); else if (c > 2) xsVar(1) = xsCall2(xsVar(0), xsID_scan, xsArg(0), xsArg(2)); else if (c > 1) xsVar(1) = xsCall1(xsVar(0), xsID_scan, xsArg(0)); else xsVar(1) = xsCall1(xsVar(0), xsID_scan, xsArg(0)); if (c > 1) xsResult = xsCall2(xsVar(0), xsID_parse, xsVar(1), xsArg(1)); else xsResult = xsCall1(xsVar(0), xsID_parse, xsVar(1)); }
void KPR_host_setBreakpoint(xsMachine* the) { #ifdef mxDebug KprHost self = xsGetHostData(xsThis); KprApplication application = (KprApplication)self->first; xsStringValue file = xsToString(xsArg(0)); xsStringValue line = xsToString(xsArg(1)); xsBeginHost(application->the); { (void)xsCall2(xsGet(xsGet(xsGlobal, xsID("xs")), xsID("debug")), xsID("setBreakpoint"), xsString(file), xsString(line)); } xsEndHost(application->the); #endif }
static void KPR_canvasRenderingContext2D_setStyle(xsMachine *the, xsBooleanValue stroke) { if (xsTypeOf(xsArg(0)) == xsStringType) { xsStringValue s = xsToString(xsArg(0)); FskColorRGBARecord color; if (KprParseColor(the, s, &color)) { FskCanvas2dContext ctx = xsGetHostData(xsThis); if (stroke) FskCanvas2dSetStrokeStyleColor(ctx, &color); else FskCanvas2dSetFillStyleColor(ctx, &color); } } else xsArg(0) = xsCall2(xsArg(0), xsID("setStyle"), xsThis, xsBoolean(stroke)); }