primPCREExec(void) { sqInt extraObj; sqInt length; int *matchSpacePtr; sqInt matchSpaceSize; sqInt result; char *searchBuffer; sqInt searchObject; /* Load Parameters */ searchObject = stackObjectValue(0); searchBuffer = arrayValueOf(searchObject); length = byteSizeOf(searchObject); /* begin loadRcvrFromStackAt: */ rcvr = stackObjectValue(1); pcrePtr = ((sqInt) (fetchArrayofObject(2, rcvr))); /* begin rcvrExtraPtr */ extraObj = fetchPointerofObject(3, rcvr); extraPtr = ((sqInt) ((!(extraObj == (nilObject())) ? arrayValueOf(extraObj) : 0))); matchFlags = fetchIntegerofObject(6, rcvr); matchSpacePtr = ((int *) (fetchArrayofObject(7, rcvr))); matchSpaceSize = (byteSizeOf(fetchPointerofObject(7, rcvr))) / 4; if (failed()) { return null; } result = pcre_exec((pcre *)pcrePtr, (pcre_extra *)extraPtr, searchBuffer, length, 0, matchFlags, matchSpacePtr, matchSpaceSize); pop(2); pushInteger(result); return 0; }
primitiveAioEnable(void) { static int eventSemaphoreIndices[FD_SETSIZE]; sqInt externalObject; sqInt fd; sqInt flags; sqInt semaIndex; if ((nilObject()) == (stackValue(2))) { return primitiveFail(); } fd = stackIntegerValue(2); if (fd < 0) { return primitiveFail(); } semaIndex = stackIntegerValue(1); eventSemaphoreIndices[semaIndex] = semaIndex; externalObject = stackObjectValue(0); if (externalObject == (trueObject())) { flags = AIO_EXT; } else { flags = 0; } aioEnable(fd, &(eventSemaphoreIndices[semaIndex]), flags); pop(4); pushInteger(semaIndex); return 0; }
primitiveAioSuspend(void) { sqInt exceptionWatch; sqInt fd; sqInt flags; sqInt readWatch; sqInt writeWatch; if ((nilObject()) == (stackValue(3))) { return primitiveFail(); } fd = stackIntegerValue(3); if (fd < 0) { return primitiveFail(); } exceptionWatch = stackObjectValue(2); readWatch = stackObjectValue(1); writeWatch = stackObjectValue(0); flags = 0; if (exceptionWatch == (trueObject())) { flags = flags | (AIO_X); } if (readWatch == (trueObject())) { flags = flags | (AIO_R); } if (writeWatch == (trueObject())) { flags = flags | (AIO_W); } aioSuspend(fd, flags); pop(5); pushInteger(flags); return 0; }
static sqInt stackLightArrayValue(sqInt stackIndex) { // B3DAcceleratorPlugin>>#stackLightArrayValue: sqInt array; sqInt arraySize; sqInt i; sqInt oop; array = stackObjectValue(stackIndex); if (array == null) { return null; } if (array == (nilObject())) { return null; } if (!((fetchClassOf(array)) == (classArray()))) { return primitiveFail(); } arraySize = slotSizeOf(array); for (i = 0; i <= (arraySize - 1); i += 1) { oop = fetchPointerofObject(i, array); if (isIntegerObject(oop)) { return primitiveFail(); } if (!((isWords(oop)) && ((slotSizeOf(oop)) == 32))) { return primitiveFail(); } } return array; }
primitiveDLSym(void) { void *addr; sqInt i; char *name; sqInt nameObj; char *namePtr; sqInt sz; nameObj = stackValue(0); if (!(isBytes(nameObj))) { return primitiveFailFor(PrimErrBadArgument); } sz = byteSizeOf(nameObj); name = malloc(sz + 1); namePtr = firstIndexableField(nameObj); for (i = 0; i < sz; i += 1) { name[i] = (namePtr[i]); } name[sz] = 0; addr = dlsym(RTLD_SELF,name); free(name); return methodReturnValue((addr == 0 ? nilObject() : (/* begin positiveMachineIntegerFor: */ (BytesPerWord == 8 ? positive64BitIntegerFor(((usqIntptr_t)addr)) : positive32BitIntegerFor(((usqIntptr_t)addr)))))); }
/* RePlugin>>#rcvrExtraPtr */ static sqInt rcvrExtraPtr(void) { sqInt extraObj; extraObj = fetchPointerofObject(3, rcvr); return ((sqInt) ((!(extraObj == (nilObject())) ? arrayValueOf(extraObj) : 0))); }
/* primitivePluginRequestState: id Return true if the operation was successfully completed. Return false if the operation was aborted. Return nil if the operation is still in progress. */ sqInt display_primitivePluginRequestState() { sqStreamRequest *req; int id; id= stackIntegerValue(0); if (id < 0 || id >= MAX_REQUESTS) return primitiveFail(); req= requests[id]; if (!req) return primitiveFail(); pop(2); if (req->state == -1) push(nilObject()); else pushBool(req->state); return 1; }
primPCREExecfromto(void) { sqInt extraObj; sqInt fromInteger; sqInt length; int *matchSpacePtr; sqInt matchSpaceSize; sqInt result; char *searchBuffer; sqInt searchObject; sqInt toInteger; /* Load Parameters */ toInteger = stackIntegerValue(0); fromInteger = stackIntegerValue(1); searchObject = stackObjectValue(2); searchBuffer = arrayValueOf(searchObject); length = byteSizeOf(searchObject); /* begin loadRcvrFromStackAt: */ rcvr = stackObjectValue(3); success(1 <= fromInteger); success(toInteger <= length); /* Smalltalk offsets are 1-based */ fromInteger -= 1; success(fromInteger <= toInteger); length = toInteger - fromInteger; /* Load Instance Variables */ searchBuffer += fromInteger; pcrePtr = ((sqInt) (fetchArrayofObject(2, rcvr))); /* begin rcvrExtraPtr */ extraObj = fetchPointerofObject(3, rcvr); extraPtr = ((sqInt) ((!(extraObj == (nilObject())) ? arrayValueOf(extraObj) : 0))); matchFlags = fetchIntegerofObject(6, rcvr); matchSpacePtr = ((int *) (fetchArrayofObject(7, rcvr))); matchSpaceSize = (byteSizeOf(fetchPointerofObject(7, rcvr))) / 4; if (failed()) { return null; } result = pcre_exec((pcre *)pcrePtr, (pcre_extra *)extraPtr, searchBuffer, length, 0, matchFlags, matchSpacePtr, matchSpaceSize); pop(4); pushInteger(result); return 0; }
static sqInt loadClientStateverticescolorsnormalstexCoords(sqInt handle, sqInt vertices, sqInt colors, sqInt normals, sqInt texCoords) { // B3DAcceleratorPlugin>>#loadClientState:vertices:colors:normals:texCoords: void *colorPtr; void *normalPtr; sqInt ok; sqInt sz; void *txPtr; void *vertexPtr; sqInt vtxSize; /* Verify vertex data */ colorPtr = (normalPtr = (txPtr = (vertexPtr = null))); if (!(isWords(vertices))) { return primitiveFail(); } /* Verify assumptions of color, normal, texCoords data */ vtxSize = (slotSizeOf(vertices)) / 3; if (!((colors == (nilObject())) || ((isWords(colors)) && ((slotSizeOf(colors)) == (vtxSize * 4))))) { return primitiveFail(); } if (!((normals == (nilObject())) || ((isWords(normals)) && ((slotSizeOf(normals)) == (vtxSize * 3))))) { return primitiveFail(); } if (!((texCoords == (nilObject())) || (isWords(texCoords)))) { return primitiveFail(); } if (!(colors == (nilObject()))) { colorPtr = firstIndexableField(colors); } if (!(normals == (nilObject()))) { normalPtr = firstIndexableField(normals); } if (!(texCoords == (nilObject()))) { sz = (slotSizeOf(texCoords)) / vtxSize; txPtr = firstIndexableField(texCoords); } vertexPtr = firstIndexableField(vertices); if (failed()) { return null; } ok = b3dLoadClientState(handle, vertexPtr, 3, colorPtr, 4, normalPtr, 3, txPtr, sz); if (!ok) { return primitiveFail(); } }
primitiveAioDisable(void) { sqInt fd; if ((nilObject()) == (stackValue(0))) { return primitiveFail(); } fd = stackIntegerValue(0); if (fd < 0) { return primitiveFail(); } aioDisable(fd); pop(2); pushInteger(fd); return 0; }
/* primitivePluginRequestFileHandle: id After a URL file request has been successfully completed, return a file handle for the received data. Note: The file handle must be read-only for security reasons. */ int display_primitivePluginRequestFileHandle() { sqStreamRequest *req; int id, fileOop; void *openFn; id= stackIntegerValue(0); if (failed()) return 0; if (id < 0 || id >= MAX_REQUESTS) return primitiveFail(); req= requests[id]; if (!req || !req->localName) return primitiveFail(); fileOop= nilObject(); if (req->localName) { DPRINT("VM: Creating file handle for %s\n", req->localName); openFn= ioLoadFunctionFrom("fileOpenNamesizewritesecure", "FilePlugin"); if (!openFn) { DPRINT("VM: Couldn't load fileOpenName:size:write:secure: from FilePlugin!\n"); return primitiveFail(); } fileOop= ((sqInt (*)(char *, sqInt, sqInt, sqInt))openFn) (req->localName, strlen(req->localName), 0 /* readonly */, 0 /* insecure */); /* if file ends in a $, it was a temp link created by the plugin */ if ('$' == req->localName[strlen(req->localName) - 1]) { DPRINT("VM: unlink %s\n", req->localName); if (-1 == unlink(req->localName)) DPRINT("VM: unlink failed: %s\n", strerror(errno)); } if (failed()) { DPRINT("VM: file open failed\n"); return 0; } } pop(2); push(fileOop); return 1; }
static void * stackMaterialValue(sqInt stackIndex) { // B3DAcceleratorPlugin>>#stackMaterialValue: sqInt oop; oop = stackObjectValue(stackIndex); if (oop == null) { return null; } if (oop == (nilObject())) { return null; } if ((isWords(oop)) && ((slotSizeOf(oop)) == 17)) { return firstIndexableField(oop); } return null; }
primPCRECompile(void) { /* begin loadRcvrFromStackAt: */ rcvr = stackObjectValue(0); patternStrPtr = ((char *) (fetchArrayofObject(0, rcvr))); compileFlags = fetchIntegerofObject(1, rcvr); if (failed()) { return null; } pcrePtr = (sqInt) pcre_compile(patternStrPtr, compileFlags, &errorStrBuffer, &errorOffset, NULL); if (pcrePtr) { allocateByteArrayAndSetRcvrPCREPtrFromPCRE(pcrePtr); extraPtr = (sqInt) pcre_study((pcre *)pcrePtr, compileFlags, &errorStrBuffer); allocateByteArrayAndSetRcvrExtraPtrFrom(extraPtr); /* begin rePluginFree: */ numFrees += 1; if ((((void *)pcrePtr)) != null) { free(((void *)pcrePtr)); } if (extraPtr) { /* begin rePluginFree: */ numFrees += 1; if ((((void *)extraPtr)) != null) { free(((void *)extraPtr)); } } if (failed()) { return null; } popthenPush(1, nilObject()); } else { errorStr = allocateStringAndSetRcvrErrorStrFromCStr(errorStrBuffer); /* begin rcvrErrorOffsetFrom: */ storeIntegerofObjectwithValue(5, rcvr, errorOffset); if (failed()) { return null; } popthenPush(1, errorStr); } return 0; }
/* primitivePluginPostURL: url target: target data: data semaIndex: semaIndex Post data to a URL into the given target. */ int display_primitivePluginPostURL() { sqStreamRequest *req; int url, urlLength; int target, targetLength; int data, dataLength; int id, semaIndex; if (!browserWindow) return primitiveFail(); for (id=0; id<MAX_REQUESTS; id++) { if (!requests[id]) break; } if (id >= MAX_REQUESTS) return primitiveFail(); semaIndex= stackIntegerValue(0); data= stackObjectValue(1); target= stackObjectValue(2); url= stackObjectValue(3); if (failed()) return 0; if (target == nilObject()) target= 0; if (!isBytes(url) || !isBytes(data) || !(!target || isBytes(target))) return primitiveFail(); urlLength= byteSizeOf(url); targetLength= target ? byteSizeOf(target) : 0; dataLength= byteSizeOf(data); req= calloc(1, sizeof(sqStreamRequest)); if(!req) return primitiveFail(); req->localName= NULL; req->semaIndex= semaIndex; req->state= -1; requests[id]= req; browserPostURLRequest(id, firstIndexableField(url), urlLength, target ? firstIndexableField(target) : NULL, targetLength, firstIndexableField(data), dataLength); pop(4); push(positive32BitIntegerFor(id)); return 1; }
/* RePlugin>>#allocateByteArrayAndSetRcvrExtraPtrFrom: */ static sqInt allocateByteArrayAndSetRcvrExtraPtrFrom(sqInt anExtraPtr) { void *extraByteArrayPtr; sqInt extraObject; extraByteArrayPtr = 0; if (anExtraPtr) { /* Allocate a Smalltalk ByteArray -- lastAlloc contains the length */ extraObject = instantiateClassindexableSize(classByteArray(), sizeof(real_pcre_extra)); /* begin loadRcvrFromStackAt: */ rcvr = stackObjectValue(0); extraByteArrayPtr = arrayValueOf(extraObject); memcpy(extraByteArrayPtr, (void *) anExtraPtr, sizeof(real_pcre_extra)); } else { extraObject = nilObject(); } /* begin rcvrExtraPtrFrom: */ storePointerofObjectwithValue(3, rcvr, extraObject); return extraObject; }
primitiveGetStringProperty(void) { sqInt handle; sqInt i; char *oopPtr; sqInt propID; sqInt stringLen; sqInt stringOop; char *stringPtr; if (!((methodArgumentCount()) == 2)) { return primitiveFail(); } propID = stackIntegerValue(0); handle = stackIntegerValue(1); if (failed()) { return null; } stringPtr = sqGetStringPropertySSL(handle, propID); if (failed()) { return null; } if (stringPtr == null) { stringOop = nilObject(); } else { stringLen = strlen(stringPtr); stringOop = instantiateClassindexableSize(classString(), stringLen); oopPtr = firstIndexableField(stringOop); for (i = 0; i < stringLen; i += 1) { oopPtr[i] = (stringPtr[i]); } } popthenPush((methodArgumentCount()) + 1, stringOop); return 0; }
primitiveDirectoryLookup(void) { // FilePlugin>>#primitiveDirectoryLookup sqInt createDate; sqInt dirFlag; char entryName[256]; sqInt entryNameSize; squeakFileOffsetType fileSize; sqInt index; sqInt modifiedDate; sqInt okToList; sqInt pathName; char *pathNameIndex; sqInt pathNameSize; sqInt posixPermissions; sqInt status; sqInt symlinkFlag; index = stackIntegerValue(0); pathName = stackValue(1); if (!(isBytes(pathName))) { return primitiveFail(); } pathNameIndex = firstIndexableField(pathName); /* If the security plugin can be loaded, use it to check for permission. If not, assume it's ok */ pathNameSize = byteSizeOf(pathName); if (sCLPfn != 0) { okToList = ((sqInt (*)(char *, sqInt))sCLPfn)(pathNameIndex, pathNameSize); } else { okToList = 1; } if (okToList) { status = dir_Lookup( pathNameIndex, pathNameSize, index, entryName, &entryNameSize, &createDate, &modifiedDate, &dirFlag, &fileSize, &posixPermissions, &symlinkFlag); } else { status = DirNoMoreEntries; } if (failed()) { return null; } if (status == DirNoMoreEntries) { /* no more entries; return nil */ /* pop pathName, index, rcvr */ popthenPush(3, nilObject()); return null; } if (status == DirBadPath) { return primitiveFail(); } popthenPush(3, makeDirEntryNamesizecreateDatemodDateisDirfileSizeposixPermissionsisSymlink(entryName, entryNameSize, createDate, modifiedDate, dirFlag, fileSize, posixPermissions, symlinkFlag)); }