/*lint -esym(715, hwInstData) available for customer use */ EAS_RESULT EAS_HWReadFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *pBuffer, EAS_I32 n, EAS_I32 *pBytesRead) { EAS_I32 count; /* simulate failure */ if (errorConditions[eReadError]) return EAS_FAILURE; /* make sure we have a valid handle */ if (file->buffer == NULL) return EAS_ERROR_INVALID_HANDLE; /* calculate the bytes to read */ count = file->fileSize - file->filePos; if (n < count) count = n; /* copy the data to the requested location, and advance the pointer */ if (count) EAS_HWMemCpy(pBuffer, &file->buffer[file->filePos], count); file->filePos += count; *pBytesRead = count; /* were n bytes read? */ if (count!= n) return EAS_EOF; return EAS_SUCCESS; }
/*lint -esym(715, hwInstData) hwInstData available for customer use */ EAS_RESULT EAS_HWReadFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *pBuffer, EAS_I32 n, EAS_I32 *pBytesRead) { EAS_RESULT result; EAS_I32 temp; EAS_U8 *p = pBuffer; EAS_I32 bytesLeft = n; *pBytesRead = 0; /* check handle integrity */ if (file->pFile == NULL) return EAS_ERROR_INVALID_HANDLE; #ifdef DEBUG_FILE_IO EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWReadFile: Reading %d bytes from position %d\n", n, file->filePos); #endif /* try to fulfill request from buffer */ for (; bytesLeft > 0;) { /* how many bytes can we get from buffer? */ temp = file->bytesInBuffer - file->readIndex; if (temp > bytesLeft) temp = bytesLeft; /* copy data from buffer */ EAS_HWMemCpy(p, &file->buffer[file->readIndex], temp); *pBytesRead += temp; file->readIndex += temp; file->filePos += temp; bytesLeft -= temp; p += temp; /* don't refill buffer if request is bigger than buffer */ if ((bytesLeft == 0) || (bytesLeft >= EAS_FILE_BUFFER_SIZE)) break; /* refill buffer */ if ((result = EAS_HWFillBuffer(hwInstData, file)) != EAS_SUCCESS) return result; } /* more to read? do unbuffered read directly to target memory */ if (bytesLeft) { /* position the file pointer */ if (fseek(file->pFile, file->filePos, SEEK_SET) != 0) return EAS_ERROR_FILE_SEEK; /* read data in the buffer */ /*lint -e{826} lint doesn't like this with STATIC_MEMORY defined for some reason */ temp = (EAS_I32) fread(p, 1, (size_t) bytesLeft, file->pFile); *pBytesRead += temp; file->filePos += temp; /* reset buffer info */ file->bytesInBuffer = 0; file->readIndex = 0; } #ifdef DEBUG_FILE_IO { #define BYTES_PER_LINE 16 char str[BYTES_PER_LINE * 3 + 1]; EAS_INT i; for (i = 0; i < (n > BYTES_PER_LINE ? BYTES_PER_LINE : n) ; i ++) sprintf(&str[i*3], "%02x ", ((EAS_U8*)pBuffer)[i]); if (i) EAS_ReportX(_EAS_SEVERITY_NOFILTER, "%s\n", str); } #endif /* were n bytes read? */ if (*pBytesRead != n) return EAS_EOF; return EAS_SUCCESS; }