* adfReadFile * */
| 367 | * |
| 368 | */ |
| 369 | int32_t adfReadFile(struct File* file, int32_t n, uint8_t *buffer) |
| 370 | { |
| 371 | int32_t bytesRead; |
| 372 | uint8_t *dataPtr, *bufPtr; |
| 373 | int blockSize, size; |
| 374 | |
| 375 | if (n==0) return(n); |
| 376 | blockSize = file->volume->datablockSize; |
| 377 | /*puts("adfReadFile");*/ |
| 378 | if (file->pos+n > file->fileHdr->byteSize) |
| 379 | n = file->fileHdr->byteSize - file->pos; |
| 380 | |
| 381 | if (isOFS(file->volume->dosType)) |
| 382 | dataPtr = (uint8_t*)(file->currentData)+24; |
| 383 | else |
| 384 | dataPtr = file->currentData; |
| 385 | |
| 386 | if (file->pos==0 || file->posInDataBlk==blockSize) { |
| 387 | adfReadNextFileBlock(file); |
| 388 | file->posInDataBlk = 0; |
| 389 | } |
| 390 | |
| 391 | bytesRead = 0; bufPtr = buffer; |
| 392 | size = 0; |
| 393 | while ( bytesRead < n ) { |
| 394 | size = min(n-bytesRead, blockSize-file->posInDataBlk); |
| 395 | memcpy(bufPtr, dataPtr+file->posInDataBlk, size); |
| 396 | bufPtr += size; |
| 397 | file->pos += size; |
| 398 | bytesRead += size; |
| 399 | file->posInDataBlk += size; |
| 400 | if (file->posInDataBlk==blockSize && bytesRead<n) { |
| 401 | adfReadNextFileBlock(file); |
| 402 | file->posInDataBlk = 0; |
| 403 | } |
| 404 | } |
| 405 | file->eof = (file->pos==file->fileHdr->byteSize); |
| 406 | return( bytesRead ); |
| 407 | } |
| 408 | |
| 409 | |
| 410 | /* |
no test coverage detected