primitiveFileRead(void) { // FilePlugin>>#primitiveFileRead sqInt array; sqInt bytesRead; size_t count; size_t elementSize; SQFile *file; sqInt objectPointer; sqInt retryCount; size_t startIndex; retryCount = 0; count = positive32BitValueOf(stackValue(0)); startIndex = positive32BitValueOf(stackValue(1)); while (1) { array = stackValue(2); /* begin fileValueOf: */ objectPointer = stackValue(3); if (!((isBytes(objectPointer)) && ((byteSizeOf(objectPointer)) == (sizeof(SQFile))))) { primitiveFail(); file = null; goto l1; } file = firstIndexableField(objectPointer); l1: /* end fileValueOf: */; if ((failed()) || (!(isWordsOrBytes(array)))) { return primitiveFailFor(PrimErrBadArgument); } elementSize = (isWords(array) ? 4 : 1); if (!((startIndex >= 1) && (((startIndex + count) - 1) <= (slotSizeOf(array))))) { return primitiveFailFor(PrimErrBadIndex); } bytesRead = sqFileReadIntoAt(file, count * elementSize, ((char *) (firstIndexableField(array))), (startIndex - 1) * elementSize); if (!(((primitiveFailureCode()) == PrimErrObjectMayMove) && (((retryCount += 1)) <= 2))) break; tenuringIncrementalGC(); primitiveFailFor(PrimNoErr); } if (!(failed())) { popthenPush(5, integerObjectOf(bytesRead / elementSize)); } }
EXPORT(sqInt) primitiveFileRead(void) { sqInt bytesRead; size_t count; sqInt array; size_t byteSize; char * arrayIndex; size_t startIndex; SQFile * file; sqInt objectPointer; count = interpreterProxy->positive32BitValueOf(interpreterProxy->stackValue(0)); startIndex = interpreterProxy->positive32BitValueOf(interpreterProxy->stackValue(1)); array = interpreterProxy->stackValue(2); /* begin fileValueOf: */ objectPointer = interpreterProxy->stackValue(3); if (!((interpreterProxy->isBytes(objectPointer)) && ((interpreterProxy->byteSizeOf(objectPointer)) == (fileRecordSize())))) { interpreterProxy->primitiveFail(); file = null; goto l1; } file = interpreterProxy->firstIndexableField(objectPointer); l1: /* end fileValueOf: */; if (!(interpreterProxy->isWordsOrBytes(array))) { return interpreterProxy->primitiveFail(); } if (interpreterProxy->isWords(array)) { byteSize = 4; } else { byteSize = 1; } if (!((startIndex >= 1) && (((startIndex + count) - 1) <= (interpreterProxy->slotSizeOf(array))))) { return interpreterProxy->primitiveFail(); } /* Note: adjust startIndex for zero-origin indexing */ arrayIndex = interpreterProxy->firstIndexableField(array); bytesRead = sqFileReadIntoAt(file, count * byteSize, arrayIndex, (startIndex - 1) * byteSize); if (!(interpreterProxy->failed())) { interpreterProxy->popthenPush(5, (((bytesRead / byteSize) << 1) | 1)); } }